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的Tornado框架对子域名和泛域名的支持
May 02 Python
深入学习python的yield和generator
Mar 10 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
Python如何通过subprocess调用adb命令详解
Aug 27 Python
TensorFlow平台下Python实现神经网络
Mar 10 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
python中的协程深入理解
Jun 10 Python
python语言基本语句用法总结
Jun 11 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 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二分法在IP地址查询中的应用
2008/08/12 PHP
微信公众平台接口开发入门示例
2014/12/24 PHP
PHP 接入微信扫码支付总结(总结篇)
2016/11/03 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
javascript基本语法
2016/05/31 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
url传递的参数值中包含&时,url自动截断问题的解决方法
2016/08/02 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
微信小程序 小程序制作及动画(animation样式)详解
2017/01/06 Javascript
js实现图片懒加载效果
2017/07/17 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
微信小程序中的列表切换功能实例代码详解
2020/06/09 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
python实现socket端口重定向示例
2014/02/10 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
python 实现简易的记事本
2020/11/30 Python
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
大学毕业生通用自荐信范文
2013/10/31 职场文书
新闻学毕业生自荐信
2013/11/15 职场文书
医科大学生的自我评价
2013/12/04 职场文书
大学毕业生通用自我评价
2014/01/05 职场文书
社区工作者思想汇报
2014/01/13 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
高三霸气励志标语
2014/06/24 职场文书
学校开学标语
2014/10/06 职场文书
小学教师工作总结2015
2015/04/07 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书
七年级作文之冬景
2019/11/07 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL