gpt4 book ai didi

multiprocessing - 避免全局状态扩散的 python 多处理的替代使用模式?

转载 作者:太空狗 更新时间:2023-10-29 21:47:21 25 4
gpt4 key购买 nike

这个(极其简化的示例)工作正常(Python 2.6.6、Debian Squeeze):

from multiprocessing import Pool
import numpy as np

src=None

def process(row):
return np.sum(src[row])

def main():
global src
src=np.ones((100,100))

pool=Pool(processes=16)
rows=pool.map(process,range(100))
print rows

if __name__ == "__main__":
main()

然而,经过多年的教导global state bad!!!,我所有的直觉都在告诉我,我真的真的宁愿写一些更接近于: p>

from multiprocessing import Pool
import numpy as np

def main():
src=np.ones((100,100))

def process(row):
return np.sum(src[row])

pool=Pool(processes=16)
rows=pool.map(process,range(100))
print rows

if __name__ == "__main__":
main()

但当然那是行不通的(挂掉无法腌制东西)。

这里的例子很简单,但是当你添加多个“进程”函数时,每个函数都依赖于多个额外的输入……好吧,这一切都让人想起 30 年前用 BASIC 编写的东西。尝试使用类至少通过适当的函数聚合状态似乎是一个明显的解决方案,但是 doesn't seem to be that easy在实践中。

对于使用 multiprocessing.pool 是否有一些推荐的模式或风格,这将避免全局状态的扩散以支持我想要并行映射的每个函数?

经验丰富的“多处理专家”如何处理这个问题?

更新:请注意,我实际上对处理更大的数组很感兴趣,因此上面的变体 pickle src 每次调用/迭代都不太好作为将其 fork 到池的工作进程中的那些。

最佳答案

您总是可以像这样传递一个可调用对象,然后该对象可以包含共享状态:

from multiprocessing import Pool
import numpy as np

class RowProcessor(object):
def __init__(self, src):
self.__src = src
def __call__(self, row):
return np.sum(self.__src[row])

def main():
src=np.ones((100,100))
p = RowProcessor(src)

pool=Pool(processes=16)
rows = pool.map(p, range(100))
print rows

if __name__ == "__main__":
main()

关于multiprocessing - 避免全局状态扩散的 python 多处理的替代使用模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10152377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com