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的Flask框架的简介和安装方法
Nov 13 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
Python实现对文件进行单词划分并去重排序操作示例
Jul 10 Python
Python中按键来获取指定的值
Mar 02 Python
pow在python中的含义及用法
Jul 11 Python
在Django的View中使用asyncio的方法
Jul 12 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
Dec 04 Python
python3 webp转gif格式的实现示例
Dec 10 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
详解python polyscope库的安装和例程
Nov 13 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代码
2013/12/03 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
php中文字符串截取多种方法汇总
2016/10/06 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
jQuery 网易相册鼠标移动显示隐藏效果实现代码
2013/03/31 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
常用DOM整理
2015/06/16 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
input输入密码变黑点密文的实现方法
2017/01/09 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
[06:24]DOTA2 2015国际邀请赛中国区预选赛第二日TOP10
2015/05/27 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
Python中的探索性数据分析(功能式)
2017/12/22 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
2019/12/06 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
Python print不能立即打印的解决方式
2020/02/19 Python
美国网上眼镜商城:Zenni Optical
2016/11/20 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
MediaMarkt比利时:欧洲最大电器连锁店
2020/12/21 全球购物
Araks官网:纽约内衣品牌
2020/10/15 全球购物
实习护理工作自我评价
2013/09/25 职场文书
室内设计专业个人的自我评价
2013/10/19 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
产品销售计划书
2014/05/04 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
独生子女证明范本
2015/06/19 职场文书
爱岗敬业事迹材料
2019/06/20 职场文书
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android