对于authenticateToSharedNotebook
shareNotebook
为什么multiprocessing
和 pool = Pool()
result = pool.map(func, arg)
pool.close()
pool.join()
是使代码安全所必需的?没有它们会有什么不良后果?
在循环中,将这些线放在循环内部或外部会更好吗?
例如,
close
和
join
我看到其他人建议CPU绑定任务的多进程和IO绑定任务的多线程。但是,将多线程应用于CPU绑定和多进程到IO绑定有什么缺点?
答案 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()
方法。