繁体   English   中英

Python 多处理:如何启动相互依赖的进程?

[英]Python multiprocessing: How to start processes that depend on each other?

我有一个关于 Python 多处理方法的基本问题,即如何以最佳方式启动使用队列传输数据的不同进程。

为此,我使用一个简单的例子,其中

  1. 收到数据
  2. 数据被处理
  3. 数据发送

所有上面的步骤应该通过三个不同的过程并行发生。

这里的示例代码:

import multiprocessing
import keyboard
import time

def getData(queue_raw):
    for num in range(1000):
        queue_raw.put(num)
        print("getData: put "+ str(num)+" in queue_raw")
    while True:
        if keyboard.read_key() == "s":
            break

def calcFeatures(queue_raw, queue_features):
    while not queue_raw.empty():
        data = queue_raw.get()
        queue_features.put(data**2)
        print("calcFeatures: put "+ str(data**2)+" in queue_features")

def sendFeatures(queue_features):
    while not queue_features.empty():
        feature = queue_features.get()
        print("sendFeatures: put "+ str(feature)+" out")

if __name__ == "__main__":

    queue_raw = multiprocessing.Queue()
    queue_features = multiprocessing.Queue()

    processes = [

        multiprocessing.Process(target=getData, args=(queue_raw,)),
        multiprocessing.Process(target=calcFeatures, args=(queue_raw, queue_features,)),
        multiprocessing.Process(target=sendFeatures, args=(queue_features,))
    ]

    processes[0].start()
    time.sleep(0.1)
    processes[1].start()
    time.sleep(0.1)
    processes[2].start()

    #for p in processes:
    #    p.start()
    for p in processes:
        p.join()

该程序有效,但我的问题是关于不同进程的开始。 理想情况下,仅当process[0]将数据放入queue_raw process[1]应启动; process[2]应该只在process[1]将计算的特征放入queue_features

现在我通过time.sleep()函数做到了这一点,这是次优的,因为我不一定知道这些过程需要多长时间。 我也尝试过类似的事情:

processes[0].start()
while queue_raw.empty():
    time.sleep(0.5)
processes[1].start()

但它不起作用,因为只估计了第一个过程。 有什么方法可以完成这个过程依赖的开始?

@moooeeeeep 指出了正确的评论。 检查while not queue.empty():不是等到数据实际在队列中!

通过哨兵对象(此处为None )和while True循环的方法将强制该进程等待,直到其他进程将数据放入队列中:

FLAG_STOP=False
while FLAG_STOP is False:
    data = queue_raw.get()  # get will wait
    if data is None:
        # Finish analysis
        FLAG_STOP = True
    else:
        # work with data

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM