我有这个程序,所有内容都构建在一个类对象中。有一个函数可以对另一个函数进行50次计算,每个函数都有不同的输入,因此我决定使用多重处理来加快速度。但是,最后需要返回的列表始终返回空。有任何想法吗?这是我的问题的简化版本。 main_function()的输出应该是包含数字0-9的列表,但是该列表返回空。
class MyClass(object):
def __init__(self):
self.arr = list()
def helper_function(self, n):
self.arr.append(n)
def main_function(self):
jobs = []
for i in range(0,10):
p = multiprocessing.Process(target=self.helper_function, args=(i,))
jobs.append(p)
p.start()
for job in jobs:
jobs.join()
print(self.arr)
[arr
是不会在子流程实例之间共享的list
。
为此,您必须使用Manager
对象创建一个托管列表,该列表知道在进程之间共享该事实。
关键是:
self.arr = multiprocessing.Manager().list()
完整的示例:
import multiprocessing
class MyClass(object):
def __init__(self):
self.arr = multiprocessing.Manager().list()
def helper_function(self, n):
self.arr.append(n)
def main_function(self):
jobs = []
for i in range(0,10):
p = multiprocessing.Process(target=self.helper_function, args=(i,))
jobs.append(p)
p.start()
for job in jobs:
job.join()
print(self.arr)
if __name__ == "__main__":
a = MyClass()
a.main_function()
此代码现在打印:[7, 9, 2, 8, 6, 0, 4, 3, 1, 5]
多重处理很敏感。
对于简单的多处理任务,我建议:
from multiprocessing.dummy import Pool as ThreadPool
class MyClass(object):
def __init__(self):
self.arr = list()
def helper_function(self, n):
print(n)
self.arr.append(n)
def main_function(self):
pool = ThreadPool(4)
pool.map(self.helper_function, range(10))
print(self.arr)
if __name__ == '__main__':
c = MyClass()
c.main_function()
使用映射而不是复杂的多线程调用的想法来自我最喜欢的博客文章之一:https://chriskiehl.com/article/parallelism-in-one-line