【问题标题】:How to do inter-process communication?如何进行进程间通信?
【发布时间】:2021-05-26 21:42:20
【问题描述】:

我们在 Raspberry Pi3 上使用 Python3 进行多处理。我们在流程中进行口罩检测、人数统计和咳嗽检测。我们目前有 3 个流程。所有都被描述为功能。 (def mask (), .. def cough () 等)它们都是同时工作的,这里没有问题。问题是作为第4个进程,我们要根据这3个进程的信息来写一个报警函数。

我们的目标是,如果在这 3 种检测中出现意外情况(例如口罩使用错误、人数过多),则会在屏幕上打印错误。 4. 作为一个进程,我们不能在alarm ()函数下用if-else命令使用其他函数返回的值。我写了下面代码的那种总结。我们如何在流程中使用数据?现在,alarm() 无法正常工作。

def mask():
      while True:
         if problem:
            return True

def cough():
      while True:
         if problem:           
            return True
def alarm():
      while True:
        if mask():
           print("Eror1")
        elif cough():
           print("Error2")

if __name__ == "__main__":
    p1 = multiprocessing.Process(target=cough,)
    p2 = multiprocessing.Process(target=mask,)
    p3 = multiprocessing.Process(target=alarm,)

    p1.start()
    p2.start()
    p3.start()
    

【问题讨论】:

    标签: python python-multiprocessing


    【解决方案1】:

    看看Python docs on multiprocessing,尤其是关于exchanging objects between processessharing state between processes的部分。

    如果您只想在某些情况发生时向主进程发出信号,那么Event 对象可能就足够了。如果您想在进程之间交换更复杂的数据,Queue 会更适合。

    使用Event 对象,您的代码大致如下所示:

    import multiprocessing
    from random import random
    import time
    
    
    def mask(event):
        while True:
            if random() < 0.1:
                event.set()
            time.sleep(1)
    
    
    def cough(event):
        while True:
            if random() < 0.2:
                event.set()
            time.sleep(1)
    
    
    def alarm(events):
        while True:
            for i, event in enumerate(events, start=1):
                # wait for up to a second for the event to be set by the other process
                # and then wait for the next event
                if event.wait(1):
                    print('Error ' + str(i))
                    event.clear()
    
    
    def main():
        e1 = multiprocessing.Event()
        p1 = multiprocessing.Process(target=mask, args=(e1,))
        p1.start()
    
        e2 = multiprocessing.Event()
        p2 = multiprocessing.Process(target=cough, args=(e2,))
        p2.start()
    
        alarm([e1, e2])
    
    
    if __name__ == '__main__':
        main()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2017-09-10
      • 2015-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多