我正在尝试使用多处理来返回一个列表,但不是等到所有进程都完成,而是从 mp_factorizer 中的一个 return 语句中获得多个返回,如下所示:
None
None
(returns list)
在这个例子中,我使用了 2 个线程。如果我使用 5 个线程,则在列出列表之前将有 5 个 None 返回。这是代码:
def mp_factorizer(nums, nprocs, objecttouse):
if __name__ == '__main__':
out_q = multiprocessing.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,
objecttouse))
procs.append(p)
p.start()
# Collect all results into a single result dict. We know how many dicts
# with results to expect.
resultlist = []
for i in range(nprocs):
temp=out_q.get()
index =0
for i in temp:
resultlist.append(temp[index][0][0:])
index +=1
# Wait for all worker processes to finish
for p in procs:
p.join()
resultlist2 = [x for x in resultlist if x != []]
return resultlist2
def worker(nums, out_q, objecttouse):
""" 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.
"""
outlist = []
for n in nums:
outputlist=objecttouse.getevents(n)
if outputlist:
outlist.append(outputlist)
out_q.put(outlist)
mp_factorizer 获取项目列表、线程数和工作人员应使用的对象,然后拆分项目列表,以便所有线程获得相同数量的列表,并启动工作人员。然后工作人员使用该对象从给定列表中计算某些内容,并将结果添加到队列中。Mp_factorizer 应该从队列中收集所有结果,将它们合并到一个大列表中并返回该列表。但是 - 我得到了多个回报。
我究竟做错了什么?还是由于 Windows 处理多处理的奇怪方式导致了这种预期的行为?(Python 2.7.3,Windows7 64 位)
编辑:问题是if __name__ == '__main__':
. 我在处理另一个问题时发现,请参阅在子进程中使用多处理以获得完整的解释。