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 Tkinter简单布局实例教程
Sep 03 Python
Python3.5 创建文件的简单实例
Apr 26 Python
python爬取哈尔滨天气信息
Jul 14 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
Python Unittest根据不同测试环境跳过用例的方法
Dec 16 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
django的csrf实现过程详解
Jul 26 Python
150行Python代码实现带界面的数独游戏
Apr 04 Python
QML实现钟表效果
Jun 02 Python
Python爬虫基础初探selenium
May 31 Python
Python matplotlib安装以及实现简单曲线的绘制
Apr 26 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生成xml简单实例代码
2009/12/16 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
php header功能的使用
2013/10/28 PHP
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
jQuery遍历Form示例代码
2013/09/03 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
javascript实现网页字符定位的方法
2015/07/14 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
微信小程序 实战实例开发流程详细介绍
2017/01/05 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
Koa2 之文件上传下载的示例代码
2018/03/29 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
Nodejs实现爬虫抓取数据实例解析
2018/07/05 NodeJs
微信小程序开发之获取用户手机号码(php接口解密)
2020/05/17 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
[01:04:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第二场 1月31日
2021/03/11 DOTA
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
Ray-Ban雷朋太阳眼镜英国官网:Ray-Ban UK
2019/11/23 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
咖啡店创业计划书
2014/08/15 职场文书
新课培训心得体会
2014/09/03 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
作弊检讨书范文
2015/05/06 职场文书
2016年第二十届“母亲节暨幸福工程救助贫困母亲活动日”活动总结
2016/04/06 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
Pytorch可视化的几种实现方法
2021/06/10 Python