我的问题是受solving embarassingly parallel problem with multiprocessing帖子评论的启发。
我问的一般情况是使用python多重处理来(1)从文件中读取数据,(2)处理数据,(3)将结果写入文件。在我描述的情况下,将从文件中读取的数据传递到(1)中的队列A,然后从(2)中的此队列A中获取。 (2)还将结果传递到单独的队列B,(3)从此队列B中获取结果以将其写入文件。
完成(1)时,它将STOP信号*传递给队列A,因此(2)知道队列A为空。 (2)然后终止并向队列B传递一个STOP信号,以便(3)知道队列B为空,并在它用完结果队列时终止。
那么是否有必要在(1)和(2)上调用多重处理.join() method?我本以为(2)直到(1)完成并发送STOP信号后才能完成?对于(3),等待是有意义的,因为如果没有(3),则后续的任何其他指令都可能继续执行。
但是也许调用.join()方法不会花费任何成本,并且可以仅用于避免考虑它吗?
*实际上,STOP信号由N个停止信号序列组成,其中N等于(2)中运行的进程数。
最佳答案
根据docs的说法,多次调用join
是安全的-这表明如果p
已经停止,p.join()
将立即返回。这意味着如果您希望p
到此时已停止,则加入它的成本应该可以忽略不计。如果p
尚未停止(如您所说,您可能希望writer进程没有停止),则根据主进程需要执行的操作来加入它可能会产生成本。如果进行任何用户交互,它将显示为挂起状态。如果这是一个问题,则可以考虑使用以下类型的模式:
while p.is_alive():
iterate_mainloop()
p.join(small_timeout)
但是,如果该过程不进行用户交互,则可以加入其他过程。这似乎是最可能发生的情况-如果您可以承受等待磁盘读取的阻塞,那么还可以等待其他进程完成(以防御性超时为模,以防其行为不当)。