首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多线程和多进程池在多处理中的应用

多线程和多进程池在多处理中的应用
EN

Stack Overflow用户
提问于 2016-07-21 16:23:26
回答 1查看 142关注 0票数 0

至于multiprocessing中的多线程和多进程池

代码语言:javascript
运行
复制
 pool = Pool()
 result = pool.map(func, arg)
 pool.close()
 pool.join()

为什么closejoin是确保代码安全所必需的?如果没有它们,它会产生什么坏后果?

在循环中,更好的方法是将这些行放在循环的内部还是外部?

例如,

代码语言:javascript
运行
复制
 pool = Pool()
 for x in a_ndarray:
     result = pool.map(func, x)
     save(result)
     pool.close()
     pool.join()

代码语言:javascript
运行
复制
 pool = Pool()
 for x in a_ndarray:
     result = pool.map(func, x)
     save(result)
 pool.close()
 pool.join()

我看到其他人建议对CPU绑定的任务进行多进程处理,对于IO绑定的任务建议多线程。但是,将多线程应用于CPU绑定和将多进程应用于IO绑定有哪些缺点呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 17:12:32

@李喜民间团体

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

从医生那里:

关闭() 指示当前>进程不会在此队列上放置更多数据。后台线程在将所有缓冲数据刷新到管道后将退出。当队列被垃圾收集时,会自动调用。

加入() 阻塞,直到获得和处理队列中的所有项为止。 每当将项添加到队列中时,未完成任务的计数就会上升。每当使用者线程调用task_done()以指示检索到项并完成所有工作时,计数就会下降。当未完成任务的计数降到零时,join()取消阻塞。

来源:Python文档

这将使您的代码更好、更安全,因为它将使用这些信息进行正确的垃圾收集,并将避免代码的怪异或不必要的行为,比如在子进程结束之前结束主进程。

例如,如果在启动子进程之后,您调用了一个在执行时间上可能有所不同的函数:

代码语言:javascript
运行
复制
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()方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38509514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档