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操作SQLite数据库及文件操作详解
Sep 22 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
python aiohttp的使用详解
Jun 20 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Python使用文件操作实现一个XX信息管理系统的示例
Jul 02 Python
利用django创建一个简易的博客网站的示例
Sep 29 Python
详解Python调用系统命令的六种方法
Jan 28 Python
python基础之模块的导入
Oct 24 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新手上路(七)
2006/10/09 PHP
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
PHP学习之数组的定义和填充
2011/04/17 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
2015/07/29 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
php实现产品加入购物车功能(1)
2020/07/23 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
js的逻辑运算符 ||
2010/05/31 Javascript
javascript arguments使用示例
2014/12/16 Javascript
js打造数组转json函数
2015/01/14 Javascript
jquery实现多屏多图焦点图切换特效的方法
2015/05/04 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
vue 简单自动补全的输入框的示例
2018/03/12 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
[02:08]2018年度CS GO枪械皮肤设计大赛优秀作者-完美盛典
2018/12/16 DOTA
python 内置函数filter
2017/06/01 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
python实现坦克大战
2020/04/24 Python
Django3中的自定义用户模型实例详解
2020/08/23 Python
css3制作彩色边线3d立体按钮的示例(css3按钮)
2014/05/06 HTML / CSS
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
简历的自荐信
2013/12/19 职场文书
宝宝周岁宴答谢词
2014/01/26 职场文书
李强优秀员工观后感
2015/06/16 职场文书
MySQL表的增删改查(基础)
2021/04/05 MySQL
springboot如何初始化执行sql语句
2021/06/22 Java/Android
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python