在Python中为列表中的每个项目进行线程化

时间:2013-10-11 15:39:26

标签: python multithreading

我有一个列表H = [item1, item2, item3....so on]和一个函数

def start(item1):
    p1 = Do something to item1     
    return p1

我希望函数start应该并行运行列表H中的每个项目。我知道多处理,但我已经有4个列表,使用多处理并行运行。如何实现列表中每个项目的线程化?有人可以用示例代码解释一下。

谢谢!

1 个答案:

答案 0 :(得分:4)

创建一个在线程中运行给定函数的函数并存储结果:

import threading
def run_item(f, item):
    result_info = [threading.Event(), None]
    def runit():
        result_info[1] = f(item)
        result_info[0].set()
    threading.Thread(target=runit).start()
    return result_info

然后收集结果的另一个函数:

def gather_results(result_infos):
    results = [] 
    for i in xrange(len(result_infos)):
        result_infos[i][0].wait()
        results.append(result_infos[i][1])
    return results

然后从主线程说,proc是处理项目的函数,items是要处理的项目列表:

#start processing the items
result_infos = [run_item(proc, item) for item in items]
#gather the results (blocking)
results = gather_results(result_infos)

使用示例:

>>> import time
>>> def proc(item):
...     time.sleep(2.0)
...     return item * 2
... 
>>> print gather_results([run_item(proc, item) for item in [1, 2, 10, 100]])
#2 seconds later...
[2, 4, 20, 200]