【发布时间】:2017-07-13 15:26:29
【问题描述】:
我想并行执行一个 sympy lambda 函数。 我不知道:
- 为什么它是一个 lambda 函数却可以并行工作
- 为什么当我尝试在没有池的情况下执行时它停止工作
- 如果我取消注释
lambdify中的第一个返回,为什么它会起作用?
显然降价预处理器需要在代码上方有一行文本,所以这是代码:
from multiprocessing import Pool
import sympy
from sympy.abc import x
def f(m):
return m.lambdify()(1)
class Mult():
def lambdify(self):
# return sympy.lambdify(x, 2*x, 'numpy')
self._lambdify = sympy.lambdify(x, 2 * x, 'numpy')
return self._lambdify
if __name__ == '__main__':
with Pool() as pool:
m = Mult()
print(pool.map(f, [m]))
print(pool.map(f, [m]))
print(f(m))
print(pool.map(f, [m]))
打印出来:
[2]
[2]
2
PicklingError: Can't pickle <function <lambda> at 0x000000000DF0D048>: attribute lookup <lambda> on numpy failed
(我剪掉了回溯)
如果我取消注释,它会正常工作:
[2]
[2]
2
[2]
我只在 Windows 上进行了测试,它使用 'numexpr' 而不是 'numpy' 的效果完全相同。
【问题讨论】:
-
你不能使用
multiprocessing.Pool.map()跨进程调用live对象实例的方法,除非你特意解释目标子进程如何重建你的live 对象在其一侧。例如,检查this answer。 -
@zwer 当然可以,但是没有解释第2点和第3点。
标签: python multiprocessing sympy