【发布时间】:2013-01-29 12:34:25
【问题描述】:
我正在尝试使用多处理来返回一个列表,但我不是等到所有进程都完成,而是从 mp_factorizer 中的一个返回语句中获得多个返回,如下所示:
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 64bit)
编辑:
问题是if __name__ == '__main__': 的位置错误。我在处理另一个问题时发现,请参阅using multiprocessing in a sub process 以获取完整说明。
【问题讨论】:
-
您所说的“我从一份退货声明中获得多份退货”是什么意思?另外,请发布一个可运行的示例。
-
我将发布一个示例,但需要一段时间才能确保该示例能够重现问题。多次返回的意思是,如果我写 print
mp_factorizer(list, 2, someobject),我不会让 print 命令执行一次,而是一次加上我设置线程数的次数,即 2 个线程:None None (prints list)(每个都在一个新行中)打印应该只执行一次。但我会得到 3 份打印输出。所以实际上 return 语句将在每次工作人员完成时执行(?),最后,当列表返回时。
标签: python windows-7 multiprocessing