【发布时间】:2014-02-26 10:15:24
【问题描述】:
我有一个多处理脚本,它像这样遍历字典:
jobs = []
for key, val in datadict.items():
jobs.append(pool.apply_async(worker, (val))
pool.close()
pool.join()
jobs 是结果对象的列表,(调用get() 将给出数据列表)
我想对结果进行格式化,使它们成为与输入字典具有相同键和顺序的字典。
我想在所有工作完成后简单地这样做:
result = {key: jobs[key].get() for key, val in datadict}
这很有效,因为datadict 中的键是整数(因此可用于索引作业列表)。
但后来我突然想到,结果工作列表可能不一定按照相同的顺序(因为它是创建的)——这是真的吗? (我希望订单可能会变得混乱,因为一个过程可能比另一个过程完成得更快,等等)
所以我决定将datadict 的key 传递给worker 函数,然后将结果作为元组再次返回。这样调用jobs[index].get() 将返回一个元组,其中第一个值是键(刚刚通过函数),第二个值是实际结果
然后我可以像这样创建一个字典:
result = dict([job.get() for job in jobs])
所以最终的脚本是:
def worker(val, key):
res = "Do something to val"
return (key, res)
if __name__ == "__main__":
jobs = []
for key, val in datadict.items():
jobs.append(pool.apply_async(worker, (val, key))
pool.close()
pool.join()
result = dict([job.get() for job in jobs])
但这是最好的方法吗?有几点让我很烦恼:
- 到目前为止,
jobs列表的结果顺序与输入顺序匹配 - “通过”函数传递值似乎有点愚蠢(即什么都不做)
【问题讨论】:
标签: python python-2.7 dictionary multiprocessing