我使用来自Ipython.parallel的loadbalancedview来调用可迭代的函数,即
from IPython.parallel import Client
from functools import partial
rc = Client()
lview = rc.load_balanced_view()
lview.block = True
def func(arg0, arg1, arg2):
return func2(arg0) + arg1 + arg2
def func2(arg0):
return 2*arg0
answer = lview.map(partial(func, arg1=A, arg2=B), iterable_data)函数调用func2使func不并行执行(即。吉尔起作用了吗?)我假设当您调用map时,每个集群节点都会得到func的一个副本,但它们也会得到func2的副本吗?此外,我使用functools.partial这一事实是否会引起任何问题?
发布于 2014-04-06 23:17:50
函数调用func2使func不并行执行(即。吉尔起作用了吗?)
不用谢。GIL在这里一点也不相关,在IPython.parallel中的并行性中也从来没有相关过。只有在协调每个引擎内的线程或客户端进程本身时,GIL才会出现。
我假设当您调用map时,每个集群节点都会得到func的一个副本,但它们也会得到func2的副本吗?
这是应该的,但实际上这就是您的代码会遇到问题的地方。IPython不会自动跟踪闭包和交互式命名空间中的代码依赖项,因此您将看到:
AttributeError: 'DummyMod' object has no attribute 'func'这是因为partial(func, arg1=A, arg2=B)包含对__main__.func的引用,而不是本地func本身的代码。当部分到达引擎时,它将被反序列化,并请求__main__.func,但未定义(__main__是引擎上的交互式命名空间)。您可以简单地通过确保在引擎上定义func和func2来解决这个问题:
rc[:].push(dict(func=func, func2=func2))在这一点上,您的map应该像预期的那样运行。
如果您指示IPython使用增强的酸洗库迪尔,那么它将更接近于不必手动发送引用,但它并不涵盖每种情况。
https://stackoverflow.com/questions/22867185
复制相似问题