• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

python多进程event进程间通信

Python admin 3个月前 (04-22) 211次浏览 0个评论 扫描二维码

 

嘿嘿,有的时候两个人一起干活还是需要交流的,就算是博主一值都拿生产饼干的例子来作为说明的材料,上一篇文章使用信号量表示控制同时干活的进程的数量,现在需要两个人干活的时候需要多交流交流,这个可以通过 event 实现进程之间的通信

首先我们先看下 Event 类的定义

class Event(object):

    def __init__(self):
        self._cond = Condition(Lock())#条件锁
        self._flag = Semaphore(0)#信号量参数为 0,表示允许操作的进程数为 0,初始化可以表明当前进程被阻塞

    def is_set(self):
        self._cond.acquire()#获取锁
        try:
            if self._flag.acquire(False):#当前进程不需要占用资源了
                self._flag.release()#释放资源
                return True
            return False 
        finally:
            self._cond.release()#释放锁

    def set(self):
        self._cond.acquire()
        try:
            self._flag.acquire(False)
            self._flag.release() #释放资源,那么允许其他进程操作资源
            self._cond.notify_all()#通知其他所有进程
        finally:
            self._cond.release() #释放锁资源

    def clear(self):
        self._cond.acquire()
        try:
            self._flag.acquire(False)
        finally:
            self._cond.release()

    def wait(self, timeout=None):
        self._cond.acquire()
        try:
            if self._flag.acquire(False):
                self._flag.release()
            else:
                self._cond.wait(timeout)

            if self._flag.acquire(False):
                self._flag.release()
                return True
            return False
        finally:
            self._cond.release()

测试代码

import multiprocessing
import time

def wait_for_event(e):
    print("wait_for_event: starting")
    e.wait()
    print("wairt_for_event: e.is_set()->" + str(e.is_set()))

def wait_for_event_timeout(e, t):
    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,))

    w2 = multiprocessing.Process(name = "non-block",
            target = wait_for_event_timeout,
            args = (e, 2))
    w1.start()
    w2.start()

    time.sleep(3)

    e.set()
    print("main: event is set")

输出

wait_for_event: starting  表示 name 为 block 的进程启动,但是执行到 wait()函数那被阻塞了

wait_for_event_timeout:starting 表示 name 为 non-block 的进程启动,但是执行到 wait(2),阻塞两秒继续执行

wait_for_event_timeout:e.is_set->False 由于初始化 event 对象 self._flag = Semaphore(0) 所以 is_set 函数输出为 false

mwain: event is set  主进程设置了 e.set() 
airt_for_event: e.is_set()->True 

Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明python 多进程 event 进程间通信
喜欢 (0)
admin
关于作者:

您必须 登录 才能发表评论!