至于multiprocessing中的多线程和多进程池
pool = Pool()
result = pool.map(func, arg)
pool.close()
pool.join()为什么close和join是确保代码安全所必需的?如果没有它们,它会产生什么坏后果?
在循环中,更好的方法是将这些行放在循环的内部还是外部?
例如,
pool = Pool()
for x in a_ndarray:
result = pool.map(func, x)
save(result)
pool.close()
pool.join()和
pool = Pool()
for x in a_ndarray:
result = pool.map(func, x)
save(result)
pool.close()
pool.join()我看到其他人建议对CPU绑定的任务进行多进程处理,对于IO绑定的任务建议多线程。但是,将多线程应用于CPU绑定和将多进程应用于IO绑定有哪些缺点呢?
发布于 2016-07-21 17:12:32
@李喜民间团体
基本上,这些指令将在当前的执行中设置一些闭包概念,它会说:“我不会将更多的数据放入队列(close),在继续(join)之前,我将等待子进程的结束”。
从医生那里:
关闭() 指示当前>进程不会在此队列上放置更多数据。后台线程在将所有缓冲数据刷新到管道后将退出。当队列被垃圾收集时,会自动调用。
加入() 阻塞,直到获得和处理队列中的所有项为止。 每当将项添加到队列中时,未完成任务的计数就会上升。每当使用者线程调用task_done()以指示检索到项并完成所有工作时,计数就会下降。当未完成任务的计数降到零时,join()取消阻塞。
来源:Python文档
这将使您的代码更好、更安全,因为它将使用这些信息进行正确的垃圾收集,并将避免代码的怪异或不必要的行为,比如在子进程结束之前结束主进程。
例如,如果在启动子进程之后,您调用了一个在执行时间上可能有所不同的函数:
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如果您不等待子程序完成,那么在执行过程中可以完全按照您的意愿执行,而在另一个执行中,可以只完成一个或两个子任务,这会导致奇怪的结果。
关于第二个问题,在这个场景中,在保存结果之前,我将在循环中使用.close()和.join()方法。
https://stackoverflow.com/questions/38509514
复制相似问题