0

我有多个并行进程写入 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. 我检查列表何时返回的方式似乎有些笨拙,标准方式是什么?
4

2 回答 2

2

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

于 2014-09-09T12:33:41.443 回答
1

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

from threading import Thread

class Worker(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
于 2014-09-09T13:14:24.137 回答