具有依赖于模块的嵌套函数的并行映射
这是我尝试
import numpy as np
def generate_function(a):
def func(x):
'''a complex function that uses several modules'''
return x + np.sqrt(a)
return func
if __name__ == '__main__':
f = generate_function(0.5)
x = np.arange(0, 100)
y = np.array(list(map(f, x))) # want to parallelize this step
与 multiprocessing
并行化的一个最小示例,嵌套的 func
会导致问题,因为 pickle
无法访问嵌套函数
import multiprocessing as mp
...
pool = mp.Pool(2)
y = np.array(pool.map(f, x))
AttributeError: Can't pickle local object 'generate_function.<locals>.func'
即使使用 pathos
,模块也不会导入
import pathos
...
pool = pathos.multiprocessing.ProcessPool(2)
y = np.array(pool.map(f, x))
NameError: name 'np' is not defined
请注意,Python 多处理 PicklingError:无法 pickle
并行化的最佳方法是什么?
因此,通过在 generate_function
内部重新导入来使 pathos
工作是可能的
def generate_function(a):
import numpy as np
def func(x):
'''a complex function that uses several modules'''
return x + np.sqrt(a)
return func
,但我可能有多个导入多个 generate_function
> 和多层嵌套,跟踪所有这些很快就会变得非常麻烦,所以我想避免这种混乱
def generate_function1(a):
import module1, module2, module3
from module4 import a, b
from module5 import c as d
from module6 import e as f
def func(x):
...
return func
def generate_function2(a):
import module1, module2, module3
from module4 import a, b
from module5 import c as d
from module6 import e as f
def func(x):
...
return func
def generate_generator_function(a):
import module1, module2, module3
from module4 import a, b
from module5 import c as d
from module6 import e as f
def generate_function(a):
import module1, module2, module3
from module4 import a, b
from module5 import c as d
from module6 import e as f
def func(x):
...
return func
return generate_function
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您可以使用concurrent.futures:
You may use
concurrent.futures
:这不会解决您的泡菜问题,但这是我对管理导入的类的想法。
结合@Schotty关于使用concurrent.futures的建议,你最终会得到如下所示的代码:
This won't solve your pickle problems but here's my thinking with classes to manage your imports.
Incorporating @Schotty's suggestion to use concurrent.futures you end up with code that looks like this: