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连接池实现示例程序
Nov 26 Python
在Python中处理XML的教程
Apr 29 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
Python编程实现及时获取新邮件的方法示例
Aug 10 Python
详解python 注释、变量、类型
Aug 10 Python
Django forms组件的使用教程
Oct 08 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
Dec 14 Python
Python之列表实现栈的工作功能
Jan 28 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 Python
Python安装使用Scrapy框架
Apr 12 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
PHP性能优化大全(php.ini)
2016/05/20 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP PDOStatement::rowCount讲解
2019/02/01 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
NodeJs 模仿SIP话机注册的方法
2019/06/21 NodeJs
vue3.0中setup使用(两种用法)
2020/12/02 Vue.js
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
python的mysqldb安装步骤详解
2017/08/14 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python使用tensorflow保存、加载和使用模型的方法
2018/01/31 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
Python正则表达式匹配日期与时间的方法
2019/07/07 Python
Python reversed函数及使用方法解析
2020/03/17 Python
PyQt实现计数器的方法示例
2021/01/18 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
Why we need EJB
2016/10/20 面试题
电工工作职责范本
2014/02/22 职场文书
餐饮采购员岗位职责
2014/03/15 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
普通党员对照检查材料
2014/08/28 职场文书
2014年教学工作总结
2014/11/13 职场文书