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中使用第三方库xlrd来读取Excel示例
Apr 05 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
python 用下标截取字符串的实例
Dec 25 Python
python绘制彩虹图
Dec 16 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
python利用百度云接口实现车牌识别的示例
Feb 21 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 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输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
newxtree.js代码
2007/03/13 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
jQuery功能函数详解
2015/02/01 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
使用javascript将时间转换成今天,昨天,前天等格式
2015/06/25 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
vue.js获取数据库数据实例代码
2017/05/26 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
浅谈关于.vue文件中style的scoped属性
2017/08/19 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
Python正则表达式的使用范例详解
2014/08/08 Python
在Python中使用dict和set方法的教程
2015/04/27 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
Python Queue模块详细介绍及实例
2016/12/27 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
python生成不重复随机数和对list乱序的解决方法
2018/04/09 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
python如何查看微信消息撤回
2018/11/27 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
Django更新models数据库结构步骤
2020/04/01 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
期末自我鉴定
2014/02/02 职场文书
初中班主任寄语
2014/04/04 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2016年班主任新年寄语
2015/08/18 职场文书