我的问题是受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)


但是,如果该过程不进行用户交互,则可以加入其他过程。这似乎是最可能发生的情况-如果您可以承受等待磁盘读取的阻塞,那么还可以等待其他进程完成(以防御性超时为模,以防其行为不当)。

09-30 14:18
查看更多