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脚本
Apr 05 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
python利用beautifulSoup实现爬虫
Sep 29 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
Python中线程编程之threading模块的使用详解
Jun 23 Python
Python获取CPU、内存使用率以及网络使用状态代码
Feb 08 Python
pandas创建新Dataframe并添加多行的实例
Apr 08 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python SQLAlchemy的Mapping与Declarative详解
Jul 04 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python 5个顶级异步框架推荐
Sep 09 Python
用python 绘制茎叶图和复合饼图
Feb 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
PHP base64编码后解码乱码的解决办法
2014/06/19 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
jQuery Tools tooltip使用说明
2012/07/14 Javascript
深入了解javascript中的prototype与继承
2013/04/14 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
Python Tkinter实现简易计算器功能
2018/01/30 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
对python生成业务报表的实例详解
2019/02/03 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
如何通过python检查文件是否被占用
2020/12/18 Python
印度最好的在线药品订购网站:PharmEasy
2018/11/30 全球购物
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
美术社团活动总结
2014/06/27 职场文书
私人委托书格式
2014/09/10 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
销售员工作检讨书(推荐篇)
2014/10/18 职场文书
介绍信模板
2015/01/31 职场文书
2015年后勤工作总结范文
2015/04/08 职场文书
2015年高三班主任工作总结
2015/05/21 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
同意落户证明
2015/06/19 职场文书
初中语文教学研修日志
2015/11/13 职场文书
Python基础之操作MySQL数据库
2021/05/06 Python