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中运行并行任务技巧
Feb 26 Python
详解Python文本操作相关模块
Jun 22 Python
python hook监听事件详解
Oct 25 Python
python实现图片转字符小工具
Apr 30 Python
python 反编译exe文件为py文件的实例代码
Jun 27 Python
Python换行与不换行的输出实例
Feb 19 Python
在Python中用GDAL实现矢量对栅格的切割实例
Mar 11 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
Python-opencv实现红绿两色识别操作
Jun 04 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
python中的测试框架
Nov 13 Python
Python Matplotlib绘制等高线图与渐变色扇形图
Apr 14 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
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
js面向对象编程总结
2017/02/16 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
解决vue页面刷新或者后退参数丢失的问题
2018/03/13 Javascript
详解Vue源码学习之callHook钩子函数
2018/07/25 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
angular中子控制器向父控制器传值的实例
2018/10/08 Javascript
对angular4子路由&辅助路由详解
2018/10/09 Javascript
傻瓜式解读koa中间件处理模块koa-compose的使用
2018/10/30 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python操作MySQL数据库具体方法
2013/10/28 Python
Python程序设计入门(1)基本语法简介
2014/06/13 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
Python中Proxypool库的安装与配置
2018/10/19 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
python图形用户接口实例详解
2019/12/16 Python
将labelme格式数据转化为标准的coco数据集格式方式
2020/02/17 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
澳大利亚香水在线商店:City Perfume
2020/09/02 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
连锁酒店店长职责范本
2014/02/13 职场文书
社区创先争优承诺书
2014/08/30 职场文书
公司收款委托书范本
2014/09/20 职场文书
平遥古城导游词
2015/02/03 职场文书
python自动化调用百度api解决验证码
2021/04/13 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python