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及Django框架生成二维码的方法分析
Jan 31 Python
Python生成rsa密钥对操作示例
Apr 26 Python
python如何实现视频转代码视频
Jun 17 Python
django ManyToManyField多对多关系的实例详解
Aug 09 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
Python中os模块功能与用法详解
Feb 26 Python
Python爬虫使用bs4方法实现数据解析
Aug 25 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
Python 数据可视化之Matplotlib详解
Nov 02 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 Python
Python按顺序遍历并读取文件夹中文件
Apr 29 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中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php上传图片类及用法示例
2016/05/11 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
jquery交替变换颜色的三种方法 实例代码
2013/11/19 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
jQuery.extend 函数及用法详细
2015/09/06 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
Python re模块介绍
2014/11/30 Python
python使用wmi模块获取windows下的系统信息 监控系统
2015/10/27 Python
Python中的Descriptor描述符学习教程
2016/06/02 Python
Python 编码处理-str与Unicode的区别
2016/09/06 Python
pandas将numpy数组写入到csv的实例
2018/07/04 Python
pycharm快捷键汇总
2020/02/14 Python
Html5写一个简单的俄罗斯方块小游戏
2019/12/03 HTML / CSS
PHP使用Redis队列执行定时任务实例讲解
2021/03/24 PHP
中学生学习生活的自我评价
2013/10/26 职场文书
开业主持词
2014/03/21 职场文书
暑假家长评语大全
2014/04/17 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
安装配置mysql及Navicat prenium的详细流程
2021/06/10 MySQL