首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPython并行LoadBalancedView GIL

IPython并行LoadBalancedView GIL
EN

Stack Overflow用户
提问于 2014-04-04 15:39:00
回答 1查看 690关注 0票数 1

我使用来自Ipython.parallel的loadbalancedview来调用可迭代的函数,即

代码语言:javascript
复制
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这一事实是否会引起任何问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-06 23:17:50

函数调用func2使func不并行执行(即。吉尔起作用了吗?)

不用谢。GIL在这里一点也不相关,在IPython.parallel中的并行性中也从来没有相关过。只有在协调每个引擎内的线程或客户端进程本身时,GIL才会出现。

我假设当您调用map时,每个集群节点都会得到func的一个副本,但它们也会得到func2的副本吗?

这是应该的,但实际上这就是您的代码会遇到问题的地方。IPython不会自动跟踪闭包和交互式命名空间中的代码依赖项,因此您将看到:

代码语言:javascript
复制
AttributeError: 'DummyMod' object has no attribute 'func'

这是因为partial(func, arg1=A, arg2=B)包含对__main__.func的引用,而不是本地func本身的代码。当部分到达引擎时,它将被反序列化,并请求__main__.func,但未定义(__main__是引擎上的交互式命名空间)。您可以简单地通过确保在引擎上定义funcfunc2来解决这个问题:

代码语言:javascript
复制
rc[:].push(dict(func=func, func2=func2))

在这一点上,您的map应该像预期的那样运行。

如果您指示IPython使用增强的酸洗库迪尔,那么它将更接近于不必手动发送引用,但它并不涵盖每种情况。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22867185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档