[英]IPython Parallel LoadBalancedView GIL
我使用来自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)
事实上func调用func2使得func不能并行执行(即GIL是否起作用?)我假设当你调用map时,每个集群节点都获得了func的副本,但是它们也获得了func2的副本。 此外,我使用functools.partial的事实是否会导致任何问题?
func调用func2使func不能并行执行(即GIL是否会起作用?)
一点也不。 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使用增强的酸洗库dill ,它将更接近于不必手动发送引用,但它并不涵盖所有情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.