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 07 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python yield的用法实例分析
Mar 06 Python
Django中文件上传和文件访问微项目的方法
Apr 27 Python
Python 通过爬虫实现GitHub网页的模拟登录的示例代码
Aug 17 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
Python 制作自动化翻译工具
Apr 25 Python
5行Python代码实现一键批量扣图
Jun 29 Python
python turtle绘图命令及案例
Nov 23 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
腾讯QQ php程序员面试题目整理
2010/06/08 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
2011/11/02 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
常用简易JavaScript函数
2009/04/09 Javascript
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
javascript中运用闭包和自执行函数解决大量的全局变量问题
2010/12/30 Javascript
简洁Ajax函数处理(示例代码)
2013/11/15 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
layui导航栏实现代码
2017/05/19 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
js表达式与运算符简单操作示例
2020/02/15 Javascript
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
Python3使用PyQt5制作简单的画板/手写板实例
2017/10/19 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
电脑教师的教学自我评价
2013/11/26 职场文书
酒店副总岗位职责
2013/12/24 职场文书
购房协议书
2014/04/11 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2015年植树节活动总结
2015/02/06 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
导游词之苏州阳澄湖
2019/11/15 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang