我有以下代码:
class RepeatTimer(Timer):
"""
Extending the threading.Timer class to execute functions at fixed intervals.
"""
def run(self):
while not self.finished.wait(self.interval):
self.function(*self.args, **self.kwargs)
def parallel_process(mp, arguments, cb_fn):
main_process = multiprocessing.Process(target=mp, args=[arguments, cb_fn])
side_process = RepeatTimer(30, generate_info)
final_process = multiprocessing.Process(target=create_final)
main_process.start()
side_process.start()
main_process.join()
side_process.cancel()
final_process.start()
final_process.join()
mp
、generate_info
和create_final
是我正在使用的函数。我希望同时执行mp
和generate_info
,然后在完成后执行create_final
。
如果我不使用 mp
功能,
generate_info
和 create_final
会同时运行,但是当我使用该功能后,它也会在另外两个运行时开始运行。我读到了它并了解到 join()
方法只会阻塞主进程,而不是其他多处理函数。
我该怎么做才能得到我想要的输出?即使使用
concurrent.futures
也会引发相同的错误。
您描述的情况只有一个点需要同时发生多个事情,因此按理说您只需要2个进程而不是4个(主进程+3个子进程)。减少进程数量可以更轻松地跟踪流量控制,这样您就不会意外地无序运行。这是我如何重组的一个例子:
def mp():
sleep(10)
print("mp done")
def generate_info():
print("info")
def create_final():
print("done")
if __name__ == "__main__":
mp_runner = Process(target=mp, )
mp_runner.start()
while mp_runner.is_alive():
generate_info()
mp_runner.join(1) #timeout to join gives loop timer interval
create_final()