python – 何时在进程上调用.join()?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 何时在进程上调用.join()?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3042字,纯文字阅读大概需要5分钟。
内容图文
![python – 何时在进程上调用.join()?](/upload/InfoBanner/zyjiaocheng/951/e8f2cd3a46814aeda548fcabe12dc174.jpg)
我正在阅读有关Python中多处理模块的各种教程,并且无法理解为何/何时调用process.join().例如,我偶然发现了这个例子:
nums = range(100000)
nprocs = 4
def worker(nums, out_q):
""" The worker function, invoked in a process. 'nums' is a
list of numbers to factor. The results are placed in
a dictionary that's pushed to a queue.
"""
outdict = {}
for n in nums:
outdict[n] = factorize_naive(n)
out_q.put(outdict)
# Each process will get 'chunksize' nums and a queue to put his out
# dict into
out_q = Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []
for i in range(nprocs):
p = multiprocessing.Process(
target=worker,
args=(nums[chunksize * i:chunksize * (i + 1)],
out_q))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultdict = {}
for i in range(nprocs):
resultdict.update(out_q.get())
# Wait for all worker processes to finish
for p in procs:
p.join()
print resultdict
根据我的理解,process.join()将阻止调用进程,直到调用其join方法的进程已完成执行.我还相信在上面的代码示例中启动的子进程在完成目标函数时完成执行,也就是说,在将结果推送到out_q之后.最后,我相信out_q.get()会阻止调用进程,直到有结果被拉出.因此,如果您考虑代码:
resultdict = {}
for i in range(nprocs):
resultdict.update(out_q.get())
# Wait for all worker processes to finish
for p in procs:
p.join()
out_q.get()调用阻止主进程,直到每个工作进程完成将其结果推送到队列.因此,当主进程退出for循环时,每个子进程应该已经完成??执行,对吗?
如果是这种情况,是否有任何理由在此时调用p.join()方法?并非所有工作进程都已完成,那么这是如何导致主进程“等待所有工作进程完成?”我问的主要是因为我在多个不同的例子中看到了这一点,如果我不理解某些东西,我很好奇.
解决方法:
试着运行这个:
import math
import time
from multiprocessing import Queue
import multiprocessing
def factorize_naive(n):
factors = []
for div in range(2, int(n**.5)+1):
while not n % div:
factors.append(div)
n //= div
if n != 1:
factors.append(n)
return factors
nums = range(100000)
nprocs = 4
def worker(nums, out_q):
""" The worker function, invoked in a process. 'nums' is a
list of numbers to factor. The results are placed in
a dictionary that's pushed to a queue.
"""
outdict = {}
for n in nums:
outdict[n] = factorize_naive(n)
out_q.put(outdict)
# Each process will get 'chunksize' nums and a queue to put his out
# dict into
out_q = Queue()
chunksize = int(math.ceil(len(nums) / float(nprocs)))
procs = []
for i in range(nprocs):
p = multiprocessing.Process(
target=worker,
args=(nums[chunksize * i:chunksize * (i + 1)],
out_q))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultdict = {}
for i in range(nprocs):
resultdict.update(out_q.get())
time.sleep(5)
# Wait for all worker processes to finish
for p in procs:
p.join()
print resultdict
time.sleep(15)
并打开任务管理器.您应该能够看到4个子进程在被OS终止之前进入僵尸状态几秒钟(由于连接调用):
在更复杂的情况下,子进程可以永远处于僵尸状态(就像你在另一个question中询问的情况一样),如果你创建了足够的子进程,你可以填充进程表,给操作系统造成麻烦(可能会杀死你的主要过程,以避免失败).
内容总结
以上是互联网集市为您收集整理的python – 何时在进程上调用.join()?全部内容,希望文章能够帮你解决python – 何时在进程上调用.join()?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。