自从1.0.0
版本发布以来,我一直在使用iPython
并行接口。我要做的是建立一个异步随机梯度下降系统。我看到它的方式,我想向所有节点发送一个函数,并在结果出来时得到结果。从我能够实现的内容和文档中看出,实现的标准视图并不真正支持这一点。 get(timeout)
方法会这样做,但您无法使用超时实际遍历<ASync_result>
对象中的每个条目。我设法让它运行的方式是以下
c = Client()
calls = []
for i,j in enumerate(args):
calls.append( c[ i % len( c.ids ) ].apply( f, j ) )
while condition:
dels = []
for i,j in enumerate( calls ):
try:
print j.get(0.01) #or some other timeout
dels.append( i ) #I keep track of the calls that have been called
#do something with the last result, throw a new call
calls.append( c[ i % len(c.ids) ].apply( f, argument )
except:
pass
for i,d in enumerate( dels ):
del calls[ d - i ] #delete gotten calls
#evaluate stopping condition
现在,在你们大声尖叫之前,这是一个可怕的代码和一个愚蠢的方法来做到这一点,我知道。我可以做出更好的做法,但我只是想知道在IPython.parallel中是否有一些内置的类似做法。
提前感谢任何花时间的人。
最佳, 人
答案 0 :(得分:1)
您可以创建多个异步调用,然后遍历它们。
c = Client()
dview = c[:]
asyncs = [dview.map_async(f, [arg]) for arg in args]
while asyncs:
for async in asyncs[:]:
if async.ready():
asyncs.remove(async)
print async.result[0]