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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
python实现的jpg格式图片修复代码
Apr 21 Python
python实现的简单窗口倒计时界面实例
May 05 Python
Python装饰器基础详解
Mar 09 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
python实现堆和索引堆的代码示例
Mar 19 Python
django 类视图的使用方法详解
Jul 24 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
python opencv图片编码为h264文件的实例
Dec 12 Python
python清空命令行方式
Jan 13 Python
Python入门学习之类的相关知识总结
May 25 Python
Python保存并浏览用户的历史记录
Apr 29 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
php json_encode()函数返回json数据实例代码
2014/10/10 PHP
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
映彩衣的js随笔(js图片切换效果)
2011/07/31 Javascript
基于jquery的多功能软键盘插件
2012/07/25 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
JS+CSS实现TreeMenu二级树形菜单完整实例
2015/09/18 Javascript
canvas实现图像布局填充功能
2017/02/06 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
pandas 根据列的值选取所有行的示例
2018/11/07 Python
用Python读取几十万行文本数据
2018/12/24 Python
Django组件content-type使用方法详解
2019/07/19 Python
python中open函数的基本用法示例
2019/09/07 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
公益活动策划方案
2014/01/09 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
安全生产先进个人总结
2015/02/15 职场文书
话题作文之成长
2019/12/09 职场文书