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 相关文章推荐
python3编写C/S网络程序实例教程
Aug 25 Python
利用Fn.py库在Python中进行函数式编程
Apr 22 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
详解Python打包分发工具setuptools
Aug 05 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python多线程模块Threading用法示例小结
Nov 09 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
基于python获取本地时间并转换时间戳和日期格式
Oct 27 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 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 删除记录实现代码
2009/03/12 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
nodejs实现HTTPS发起POST请求
2015/04/23 NodeJs
jQuery mobile转换url地址及获取url中目录部分的方法
2015/12/04 Javascript
Bootstrap table的使用方法
2016/11/02 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
Mint UI 基于 Vue.js 移动端组件库
2017/11/07 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
Vue引用第三方datepicker插件无法监听datepicker输入框的值的解决
2018/01/27 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
9种python web 程序的部署方式小结
2014/06/30 Python
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
Python随机生成数模块random使用实例
2015/04/13 Python
Python两个内置函数 locals 和globals(学习笔记)
2016/08/28 Python
Python之str操作方法(详解)
2017/06/19 Python
给我一面国旗 python帮你实现
2019/09/30 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
2019/11/08 Python
Django框架之中间件MiddleWare的实现
2019/12/30 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
临床医师专业个人自我评价
2014/01/08 职场文书
工程采购员岗位职责
2014/03/09 职场文书
物资采购方案
2014/06/12 职场文书
委托书范本格式
2019/04/18 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
Python实战之疫苗研发情况可视化
2021/05/18 Python
Python实现智慧校园自动评教全新版
2021/06/18 Python