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