Python多进程同步Lock、Semaphore、Event实例

 更新时间:2014年11月21日 09:37:23   投稿:junjie  
这篇文章主要介绍了Python多进程同步Lock、Semaphore、Event实例,Lock用来避免访问冲突、Semaphore用来控制对共享资源的访问数量、Event用来实现进程间同步通信,需要的朋友可以参考下

同步的方法基本与多线程相同。

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解决抓取内容乱码问题(decode和encode解码)

    详解Python解决抓取内容乱码问题(decode和encode解码)

    这篇文章主要介绍了Python解决抓取内容乱码问题(decode和encode解码),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 详解python中mongoengine库用法

    详解python中mongoengine库用法

    这篇文章主要介绍了python中mongoengine库用法,主要包括MongoDB的安装与连接过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Python不改变Excel单元格样式方式—xls和xlsx两种格式

    Python不改变Excel单元格样式方式—xls和xlsx两种格式

    这篇文章主要介绍了Python不改变Excel单元格样式方式—xls和xlsx两种格式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • python数组如何添加整行或整列

    python数组如何添加整行或整列

    这篇文章主要介绍了python数组如何添加整行或整列问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Python使用cookielib模块操作cookie的实例教程

    Python使用cookielib模块操作cookie的实例教程

    cookielib模块经常被用来和urllib等模块配合来制作爬虫或者第三方SNS客户端等程序,比如这里我们就将举一个使用cookie来发送登录信息登录人人网的例子,well,一起来看一下Python使用cookielib模块操作cookie的实例教程
    2016-07-07
  • windows下python和pip安装教程

    windows下python和pip安装教程

    这篇文章主要为大家详细介绍了windows下Python和pip安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • python实现大文本文件分割

    python实现大文本文件分割

    这篇文章主要为大家详细介绍了python实现大文本文件分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Python中print()函数的用法详情

    Python中print()函数的用法详情

    这篇文章主要介绍了Python中print()函数的用法详情,Python中print()函数的方法是打印指定的内容。在交互环境中输入“help(print)”指令,可以显示print()函数的使用方法,下面来看看具体的详细内容吧
    2022-02-02
  • PyCharm关闭碍眼的波浪线图文详解

    PyCharm关闭碍眼的波浪线图文详解

    这篇文章主要介绍了PyCharm关闭碍眼的波浪线的实现,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 用python实现超强的加密软件

    用python实现超强的加密软件

    大家好,本篇文章主要讲的是用python实现超强的加密软件,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01

最新评论