如何在 python 中使用多处理附加到 class 变量?
How can I append to class variables using multiprocessing in python?
我有这个程序,其中所有内容都构建在 class 对象中。有一个函数对另一个函数进行 50 次计算,每次计算都有不同的输入,所以我决定使用多处理来加速它。但是,最后需要返回的列表总是returns空的。有任何想法吗?这是我的问题的简化版本。 main_function() 的输出应该是一个包含数字 0-9 的列表,但是列表 returns 是空的。
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):
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
我有这个程序,其中所有内容都构建在 class 对象中。有一个函数对另一个函数进行 50 次计算,每次计算都有不同的输入,所以我决定使用多处理来加速它。但是,最后需要返回的列表总是returns空的。有任何想法吗?这是我的问题的简化版本。 main_function() 的输出应该是一个包含数字 0-9 的列表,但是列表 returns 是空的。
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):
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