python并发编程多进程 互斥锁原理解析


Posted in Python onAugust 20, 2019

运行多进程 每个子进程的内存空间是互相隔离的 进程之间数据不能共享的

互斥锁

但是进程之间都是运行在一个操作系统上,进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,

是可以的,而共享带来的是竞争,竞争带来的结果就是错乱

#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
from multiprocessing import Process
import time
def task(name):
  print("%s 1" % name)
  time.sleep(1)
  print("%s 2" % name)
  time.sleep(1)
  print("%s 3" % name)
if __name__ == '__main__':
  for i in range(3):
    p = Process(target=task, args=("子进程%s" % i,))
    p.start()
'''
子进程2 1
子进程0 1
子进程1 1
子进程2 2
子进程1 2
子进程0 2
子进程2 3
子进程1 3
子进程0 3
'''

如何控制,就是加锁处理。而互斥锁的意思就是互相排斥,如果把多个进程比喻为多个人,

互斥锁的工作原理就是多个人都要去争抢同一个资源:卫生间,一个人抢到卫生间后上一把锁,其他人都要等着,等到这个完成任务后释放锁,其他人才有可能有一个抢到......

所以互斥锁的原理,就是把并发改成串行,降低了效率,但保证了数据安全,不错乱

加了互斥锁就没有并发效果了 加上锁只有一个可以运行 互斥锁会把并发变成串行 效率变低了

解决:

导入模块 Lock

现在程序启动 所有进程首先会去抢锁 只有抢到锁的才能运行

等这个进程运行完了解锁后 再到其他进程继续抢锁

from multiprocessing import Process, Lock
import time
def task(name, mutex):
  # 加锁
  mutex.acquire()
  print("%s 1" % name)
  time.sleep(1)
  print("%s 2" % name)
  time.sleep(1)
  print("%s 3" % name)
  # 把锁拆了
  mutex.release()
if __name__ == '__main__':
  # 建一个对象实例
  mutex = Lock()
  for i in range(3):
    # 把锁传给子进程 让所有子进程用同一把锁
    p = Process(target=task, args=("子进程%s" % i, mutex))
    p.start()
'''
现在程序启动 所有进程首先会去抢锁 只有抢到锁的才能运行
等这个进程运行完了解锁后 再到其他进程继续抢锁
'''
'''
子进程0 1
子进程0 2
子进程0 3
子进程1 1
子进程1 2
子进程1 3
子进程2 1
子进程2 2
子进程2 3
'''

牺牲了效率,保证数据不错乱

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python translator使用实例
Sep 06 Python
使用Python实现下载网易云音乐的高清MV
Mar 16 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
Aug 21 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python3.0 模拟用户登录,三次错误锁定的实例
Nov 02 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
python实现飞机大战项目
Mar 11 Python
python属于哪种语言
Aug 16 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
django 配置阿里云OSS存储media文件的例子
Aug 20 #Python
python数据类型之间怎么转换技巧分享
Aug 20 #Python
python并发编程多进程之守护进程原理解析
Aug 20 #Python
python控制台实现tab补全和清屏的例子
Aug 20 #Python
关于python字符串方法分类详解
Aug 20 #Python
python+tkinter实现学生管理系统
Aug 20 #Python
Python对列表的操作知识点详解
Aug 20 #Python
You might like
php中取得文件的后缀名?
2012/02/20 PHP
php stripslashes和addslashes的区别
2014/02/03 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
PHP的几个常用加密函数
2016/02/03 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
Laravel5.5 动态切换多语言的操作方式
2019/10/25 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
javascript 一些用法小结
2009/09/11 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
ionic3 懒加载
2017/08/16 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
通过实例了解JS 连续赋值
2019/09/24 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
python之wxPython菜单使用详解
2014/09/28 Python
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
python3处理含有中文的url方法
2018/05/10 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
自荐书模板
2013/12/15 职场文书
迟到早退检讨书
2014/02/10 职场文书
房产委托公证书样本
2014/04/04 职场文书
房产继承公证书
2014/04/09 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
教师优秀党员事迹材料
2014/08/14 职场文书
家庭教育的心得体会
2014/09/01 职场文书
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang