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获取GY-85九轴模块信息示例
Dec 05 Python
python实现的二叉树算法和kmp算法实例
Apr 25 Python
Python多线程实例教程
Sep 06 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
Python断言assert的用法代码解析
Feb 03 Python
python读写LMDB文件的方法
Jul 02 Python
Python WSGI的深入理解
Aug 01 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
Django之腾讯云短信的实现
Jun 12 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 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代码包装修正版
2008/03/15 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
IE FF OPERA都可用的弹出层实现代码
2009/09/29 Javascript
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
高性能Javascript笔记 数据的存储与访问性能优化
2012/08/02 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
2015/11/23 Javascript
jQuery 选择器(61种)整理总结
2016/09/26 Javascript
详解JavaScript数组过滤相同元素的5种方法
2017/05/23 Javascript
JS基于贪心算法解决背包问题示例
2017/11/27 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
javascript中contains是否包含功能实现代码(扩展字符、数组、dom)
2020/04/07 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
[01:33]真香警告!DOTA2勇士令状不朽珍藏Ⅱ饰品欣赏
2018/06/26 DOTA
使用python开发vim插件及心得分享
2014/11/04 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python内存读写操作示例
2018/07/18 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
python手机号前7位归属地爬虫代码实例
2020/03/31 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
phonegap常用事件总结(必看篇)
2017/03/31 HTML / CSS
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
法国足球商店:Footcenter
2019/07/06 全球购物
中医临床专业自我鉴定范文
2014/01/15 职场文书
网络编辑求职信
2014/04/30 职场文书
英文求职信范文
2014/05/23 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
解除合同协议书范本
2016/03/21 职场文书