所以我Worte一些基本结构的代码如下:
from numpy import *
from dataloader import loadfile
from IPython.parallel import Client
from clustering import *
data = loadfile(0)
N_CLASSES = 10
rowmax = nanmax(data.values, 0)
rowmin = nanmin(data.values, 0)
# Defines the size of block processed at a time
BLOCK_SIZE = 50000
classmean, classcov, classcovinv, classlogdet, classlogprob = init_stats(data, N_CLASSES, rowmax, rowmin)
client = Client()
ids = client.ids
nodes = len(ids)
view = client.load_balanced_view()
dview = client[:]
def get_ml_class(data, args): do sth
dview.scatter('datablock', data)
dview.execute('res1, res2 = get_ml_class(datablock, args)', block=False)
dview.execute部分的输出是
<AsyncResult: execute>
这意味着当我试图通过
拉取结果时,它会被执行dview.pull(['res1','res2'], block=True)
它显示:
NameError: name 'res1' is not defined
有人可以告诉我我的代码有什么问题吗?非常感谢你!
答案 0 :(得分:0)
让我们举一个更简单的例子:
from IPython.parallel import Client
rc = Client()
dview = rc[:]
dview.scatter('a', Range(16))
dview.execute('res1,res2 = a[0], a[1]', block=False)
dview.pull(['res1'], block=True)
这可以按预期工作并给出结果:
[[0], [4], [8], [12]]
所以,我们至少做到了这一点。但是让我稍微改变一下代码:
from IPython.parallel import Client
rc = Client()
dview = rc[:]
dview.scatter('a', Range(16))
dview.execute('res1,res2 = a[0], b[1]', block=False)
dview.pull(['res1'], block=True)
现在我们有了NameError
。为什么呢?
因为execute
行有一个错误(它引用了不存在的变量b
)。非阻塞execute
并没有抱怨。在第一个(工作)案例中,状态为:
<AsyncResult: finished>
和第二个(非工作)案例:
<AsyncResult: execute>
除此之外它非常安静,第二条消息并不一定意味着发生了错误。要查看真实的错误消息,请将blocking
更改为True
。然后你会看到出了什么问题。
如果您想知道非阻塞执行是否有效,则必须捕获AsyncResult
返回的execute
对象。它有几个有趣的方法,但您最感兴趣的是ready
和successful
方法:
ar = dview.execute(...)
ar.ready() # True if the process has finished
ar.successful() # True if there were no exceptions raised
此外,可以使用get
对象的AsyncResult
方法获取执行期间引发的可能异常。例如,我的错误示例在交互式shell中提供:
>>> ar.get()
[0:execute]:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)<ipython-input-1-608f57d70b2f> in <module>()
----> 1 res1,res2=a[0]**2,b[1]**2
NameError: name 'b' is not defined
[1:execute]:
---------------------------------------------------------------------------
NameError Traceback (most recent call last)<ipython-input-1-608f57d70b2f> in <module>()
----> 1 res1,res2=a[0]**2,b[1]**2
NameError: name 'b' is not defined
...
因此,作为总结:尝试找出您尝试远程运行的功能出了什么问题。现在它似乎引起了一些强制。该错误可能与args
有关,而这似乎不适用于远程脚本。可能缺少scatter
?