多处理中的多线程和多进程池

时间:2016-07-21 16:23:27

标签: python multithreading multiprocessing

对于authenticateToSharedNotebook

中的多线程和多进程池
shareNotebook

为什么multiprocessing pool = Pool() result = pool.map(func, arg) pool.close() pool.join() 是使代码安全所必需的?没有它们会有什么不良后果?

在循环中,将这些线放在循环内部或外部会更好吗?

例如,

close

join

我看到其他人建议CPU绑定任务的多进程和IO绑定任务的多线程。但是,将多线程应用于CPU绑定和多进程到IO绑定有什么缺点?

1 个答案:

答案 0 :(得分:1)

@Lee Hi Folk,

基本上,这些指令会将一些闭包概念设置到当前执行中,它会说“我不会将更多数据放入队列(close)”,我将等待子流程的结束在继续之前(join)“。

来自docs:

  

接近()

     

表示当前>进程不再向此队列放置数据。一旦将所有缓冲数据刷新到管道,后台线程将退出。当队列被垃圾收集时会自动调用它。

  

加入()

     

阻止,直到队列中的所有项目都已获得并处理完毕。

     

每当项目添加到队列时,未完成任务的数量就会增加。每当消费者线程调用task_done()以指示该项目已被检索并且其上的所有工作都已完成时,计数就会下降。当未完成任务的数量降至零时,join()取消阻塞。

来源:Python Docs

这将使您的代码更好,更安全,因为它将使用此信息来执行正确的垃圾收集,并将避免代码的奇怪或不需要的行为,如结束子进程结束前的主要进程。

例如,如果在启动子进程后调用可能在时间执行上变化的函数:

pool = Pool()
for x in a_ndarray:
    result = pool(func, x)
    save(result)
non_fixed_time_function() #this could take 0.1 s or 2 hours.
#pool.join() # Don't wait for child to finish

如果你不等孩子完成,在执行中可以完全按照自己的意愿行事,在其他情况下只能完成一个孩子或2个孩子,这会导致奇怪的结果。

关于你的第二个问题,在那个场景中,我会在保存结果之前在循环中采用.close().join()方法。