python并发编程多进程 互斥锁原理解析

 更新时间:2019年08月20日 14:50:48   作者:minger_lcm  
这篇文章主要介绍了python并发编程多进程 互斥锁原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

运行多进程 每个子进程的内存空间是互相隔离的 进程之间数据不能共享的

互斥锁

但是进程之间都是运行在一个操作系统上,进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,

是可以的,而共享带来的是竞争,竞争带来的结果就是错乱

#并发运行,效率高,但竞争同一打印终端,带来了打印错乱
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编写一个浏览器集群框架

    这篇文章主要为大家详细介绍了如何使用Python编写一个浏览器集群框架,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • Python字符串常用方法以及其应用场景详解

    Python字符串常用方法以及其应用场景详解

    本人学习python时的总结,并不需要记住,知道有这个方法,拿起来用就行,下面这篇文章主要给大家介绍了关于Python字符串常用方法以及其应用场景的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • python3.5 email实现发送邮件功能

    python3.5 email实现发送邮件功能

    这篇文章主要为大家详细介绍了python3.5 email实现发送邮件功能,包含txt、图片、HTML、附件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • python从入门到实践之组合数据类型

    python从入门到实践之组合数据类型

    这篇文章主要为大家介绍了python组合数据类型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • python topN 取最大的N个数或最小的N个数方法

    python topN 取最大的N个数或最小的N个数方法

    今天小编就为大家分享一篇python topN 取最大的N个数或最小的N个数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Python定时发送消息的脚本:每天跟你女朋友说晚安

    Python定时发送消息的脚本:每天跟你女朋友说晚安

    今天小编就为大家分享一篇关于Python定时发送消息的脚本:每天跟你女朋友说晚安的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • pycharm 实现本地写代码,服务器运行的操作

    pycharm 实现本地写代码,服务器运行的操作

    这篇文章主要介绍了pycharm 实现本地写代码,服务器运行的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python批量按比例缩小图片脚本分享

    Python批量按比例缩小图片脚本分享

    这篇文章主要介绍了Python批量按比例缩小图片脚本分享,本文直接给出实现代码,需要的朋友可以参考下
    2015-05-05
  • Python学习笔记之Zip和Enumerate用法实例分析

    Python学习笔记之Zip和Enumerate用法实例分析

    这篇文章主要介绍了Python学习笔记之Zip和Enumerate用法,结合实例形式分析了Zip和Enumerate的功能、用法及相关操作注意事项,需要的朋友可以参考下
    2019-08-08
  • Python入门教程之运算符重载详解

    Python入门教程之运算符重载详解

    运算符重载意味着赋予超出其预定义的操作含义的扩展含义。例如运算符 + 用于添加两个整数以及连接两个字符串和合并两个列表。本文将通过示例带大家详细了解Python的运算符重载,感兴趣的可以了解一下
    2022-09-09

最新评论