我有一个程序,其中所有内容都构建在类对象中。有一个函数可以对另一个函数进行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)
答案 0 :(得分:6)
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]
答案 1 :(得分:0)
多重处理是敏感的。
对于简单的多处理任务,我建议:
from multiprocessing.dummy import Pool as ThreadPool
class MyClass(object):
def __init__(self):
self.arr = list()
def helper_function(self, 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()
使用map而不是复杂的多线程调用的想法来自我最喜欢的博客文章之一:https://chriskiehl.com/article/parallelism-in-one-line