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算法学习之桶排序算法实例(分块排序)
Dec 18 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
详解Python爬虫的基本写法
Jan 08 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
python3 读写文件换行符的方法
Apr 09 Python
TensorFlow Session会话控制&Variable变量详解
Jul 30 Python
python pandas生成时间列表
Jun 29 Python
python django model联合主键的例子
Aug 06 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
利用Python校准本地时间的方法教程
Oct 31 Python
Python识别处理照片中的条形码
Nov 16 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 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常用Output和ptions/Info函数集介绍
2013/06/19 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
Aptana调试javascript图解教程
2009/11/30 Javascript
javascript+iframe 实现无刷新载入整页的代码
2010/03/17 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
超简单JS二级、多级联动的简单实例
2014/02/18 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
javascript事件模型实例分析
2015/01/30 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
2017/02/24 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
Layui选项卡制作历史浏览记录的方法
2019/09/28 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
[00:12]DAC2018 天才少年转战三号位,他的SOLO是否仍如昔日般强大?
2018/04/06 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
python列表操作使用示例分享
2014/02/21 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
详解Django CAS 解决方案
2019/10/30 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
海淘母婴商城:国际妈咪
2016/07/23 全球购物
Omio英国:搜索并比较便宜的巴士、火车和飞机
2019/08/27 全球购物
毕业生自荐信
2013/12/14 职场文书
食堂员工工作职责
2013/12/18 职场文书
大学毕业后的十年规划
2014/01/07 职场文书
护理个人求职信范文
2014/01/08 职场文书
校三好学生主要事迹
2014/01/11 职场文书
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA