我在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
我不喜欢这种方式:
答案 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