并行写入python中的列表

时间:2014-09-09 12:28:54

标签: python parallel-python

我在python中将多个并行进程写入一个列表。我的代码是:

global_list = []
class MyThread(threading.Thread):
    ...
    def run(self):
    results = self.calculate_results()

    global_list.extend(results)


def total_results():
    for param in params:
         t = MyThread(param)
         t.start()
    while threading.active_count() > 1:
        pass
    return total_results

我不喜欢这种方式:

  1. 整体全局变量 - >为total_results函数设置局部变量的方法是什么?
  2. 我检查列表返回时的方式看起来有点笨拙,标准方法是什么?

2 个答案:

答案 0 :(得分:2)

您的计算是CPU密集型的吗?如果是这样,您应该查看Python附带的多处理模块,并提供一个相当容易使用的Pool类,您可以在其中提供计算任务,然后获取所有结果。如果你需要大量的CPU时间,那么无论如何都会更快,因为Python不能很好地进行线程化:在一个进程中一次只能运行一个解释器线程。多处理可以避开(并提供Pool抽象,使您的工作更轻松)。哦,如果你真的想坚持使用线程,多处理也有一个ThreadPool。

答案 1 :(得分:1)

1 - 使用所有工作人员实例之间共享的类变量来附加结果

class Worker(threading.Thread):
    results = []
    ...

    def run(self):
        results = self.calculate_results()
        Worker.results.extend(results) # extending a list is thread safe

2 - 使用join()等待所有线程完成并让它们有一些计算时间

def total_results(params):
    # create all workers
    workers = [Worker(p) for p in params]

    # start all workers
    [w.start() for w in workers]

    # wait for all of them to finish
    [w.join() for w in workers]

    #get the result
    return Worker.results