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中map、any、all函数用法分析
Apr 21 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
python pandas 如何替换某列的一个值
Jun 09 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python3使用GUI统计代码量
Sep 18 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Numpy一维线性插值函数的用法
Apr 22 Python
Django def clean()函数对表单中的数据进行验证操作
Jul 09 Python
Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
Dec 07 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
聊聊pytorch测试的时候为何要加上model.eval()
May 23 Python
Python matplotlib可视化之绘制韦恩图
Feb 24 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之require/include顺序 推荐
2011/01/02 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
WordPress过滤垃圾评论的几种主要方法小结
2016/07/11 PHP
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
从零开始学习Node.js系列教程二:文本提交与显示方法
2017/04/13 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
推荐15个最好用的JavaScript代码压缩工具
2019/02/13 Javascript
Vue.js实现开发购物车功能的方法详解
2019/02/22 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
python杀死一个线程的方法
2015/09/06 Python
举例讲解Python中的身份运算符的使用方法
2015/10/13 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
详解python itertools功能
2020/02/07 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
纺织工程专业个人求职信范文
2014/01/27 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
服务行业演讲稿
2014/09/02 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
python cv2图像质量压缩的算法示例
2021/06/04 Python
Docker部署Mysql8的实现步骤
2022/07/07 Servers