Python多进程同步Lock、Semaphore、Event实例


Posted in Python onNovember 21, 2014

同步的方法基本与多线程相同。

1) Lock

当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。

import multiprocessing

import sys
def worker_with(lock, f):

    with lock:

        fs = open(f,"a+")

        fs.write('Lock acquired via with\n')

        fs.close()

        

def worker_no_with(lock, f):

    lock.acquire()

    try:

        fs = open(f,"a+")

        fs.write('Lock acquired directly\n')

        fs.close()

    finally:

        lock.release()
if __name__ == "__main__":
    f = "file.txt"

  

    lock = multiprocessing.Lock()

    w = multiprocessing.Process(target=worker_with, args=(lock, f))

    nw = multiprocessing.Process(target=worker_no_with, args=(lock, f))
    w.start()

    nw.start()
    w.join()

    nw.join()

在上面的例子中,如果两个进程没有使用lock来同步,则他们对同一个文件的写操作可能会出现混乱。

2)Semaphore

Semaphore用来控制对共享资源的访问数量,例如池的最大连接数。

import multiprocessing

import time
def worker(s,i):

    s.acquire()

    print(multiprocessing.current_process().name + " acquire")

    time.sleep(i)

    print(multiprocessing.current_process().name + " release")

    s.release()
if __name__ == "__main__":

  

    s = multiprocessing.Semaphore(2)

    for i in range(5):

        p = multiprocessing.Process(target=worker, args=(s,i*2))

        p.start()

上面的实例中使用semaphore限制了最多有2个进程同时执行。

3)Event

Event用来实现进程间同步通信。

import multiprocessing

import time
def wait_for_event(e):

    """Wait for the event to be set before doing anything"""

    print ('wait_for_event: starting')

    e.wait()

    print ('wait_for_event: e.is_set()->' + str(e.is_set()))
def wait_for_event_timeout(e, t):

    """Wait t seconds and then timeout"""

    print ('wait_for_event_timeout: starting')

    e.wait(t)

    print ('wait_for_event_timeout: e.is_set()->' + str(e.is_set()))


if __name__ == '__main__':

    e = multiprocessing.Event()

    w1 = multiprocessing.Process(name='block', 

                                 target=wait_for_event,

                                 args=(e,))

    w1.start()
    w2 = multiprocessing.Process(name='non-block', 

                                 target=wait_for_event_timeout, 

                                 args=(e, 2))

    w2.start()
    time.sleep(3)

    e.set()

    print ('main: event is set')

    

#the output is:

#wait_for_event_timeout: starting

#wait_for_event: starting

#wait_for_event_timeout: e.is_set()->False

#main: event is set

#wait_for_event: e.is_set()->True
Python 相关文章推荐
简单总结Python中序列与字典的相同和不同之处
Jan 19 Python
python+matplotlib演示电偶极子实例代码
Jan 12 Python
python3监控CentOS磁盘空间脚本
Jun 21 Python
解决python ogr shp字段写入中文乱码的问题
Dec 31 Python
python使用 zip 同时迭代多个序列示例
Jul 06 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
wxPython:python首选的GUI库实例分享
Oct 05 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
关于tf.TFRecordReader()函数的用法解析
Feb 17 Python
Python脚本打包成可执行文件过程解析
Oct 20 Python
Python类的继承super相关原理解析
Oct 22 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Nov 21 #Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 #Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
Nov 21 #Python
Python实现的下载8000首儿歌的代码分享
Nov 21 #Python
Python常用模块介绍
Nov 21 #Python
Python使用py2exe打包程序介绍
Nov 20 #Python
Python实现的tab文件操作类分享
Nov 20 #Python
You might like
如何分别全角和半角以避免乱码
2006/10/09 PHP
我的论坛源代码(八)
2006/10/09 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
PHP类的自动加载机制实现方法分析
2019/01/10 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
js no-repeat写法 背景不重复
2009/03/18 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
基于JQuery制作可编辑的表格特效
2014/12/23 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
在react中使用vue的状态管理的方法示例
2020/05/02 Javascript
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
Python实现八大排序算法
2016/08/13 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
Python列表(List)知识点总结
2019/02/18 Python
python使用百度文字识别功能方法详解
2019/07/23 Python
Python 求数组局部最大值的实例
2019/11/26 Python
python中的django是做什么的
2020/07/31 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
Overload和Override的区别
2012/09/02 面试题
关于礼仪的演讲稿
2014/01/04 职场文书
大学军训感言300字
2014/03/09 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL
Python中的socket网络模块介绍
2022/07/23 Python