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



我有一个基本问题,它困扰着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()

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

@moooeeeep指出了正确的评论。 与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

相关内容

  • 没有找到相关文章

最新更新