gpt4 book ai didi

python - IPython 并行 LoadBalancedView GIL

转载 作者:行者123 更新时间:2023-11-30 23:25:43 25 4
gpt4 key购买 nike

我使用 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 会导致任何问题吗?

最佳答案

Does the fact that func calls func2 make func not be executed in parallel (ie. does the GIL come into play?)

一点也不。 GIL 在这里完全不相关,也与 IPython.parallel 中的并行性无关。 GIL 仅在协调每个引擎内或客户端进程本身内的线程时才会出现。

I assume that when you call map, each cluster node gets a copy of func, but do they also get copies of 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 使用增强型 pickling 库 dill它将更接近不必手动发送引用文献,但它并不能涵盖所有情况。

关于python - IPython 并行 LoadBalancedView GIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22867185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com