我尝试在python中使用多处理包。
我的代码旨在根据传递给多个处理器的收集日期生成输出...
years = [2013]
days = [1,2,3,4,5,6,7,8,9,10]
months = [8]
hours = [0, 6, 12, 18]
ens = [1, 2, 3, 4]
nens = len(days) * len(hours)
hour = hours * len(days)
year = years * len(days) * len(hours)
month = months * len(days) * len(hours)
temp =[]
for d in days:
temp.append([d]*len(hours))
day = [x for sublist in temp for x in sublist]
hour = hours * len(days)
nens = ens * len(days)
在这个例子中,我有260次传递给不同的处理器。
t1 = c[:].map_sync(doCoolStuff, year, month, day, hour, nens, [options] * len(day) )
有些时候,有一天缺少/不完整的数据。当发生这种情况时,它会杀死其他节点上的所有进程。有没有办法捕捉这些实例?我不确定尝试/除了在这里工作。
由于
答案 0 :(得分:0)
我可以在这里想到两个选择。一种方法是确保doCoolStuff函数永远不会抛出异常,而是返回None或其他表示发生错误的东西。另一个选择是使用imap而不是map_sync,并在try / except块内一次循环迭代器一个元素。
it = c[:].imap(doCoolStuff, year, month, day, hour, nens, [options] * len(day))
t1 = []
while True:
try:
t1.append(it.next())
except StopIteration:
break
except Exception as e:
print "Caught an exception: %s" % e
这种方法适用于多处理模块,看起来IPython确实有一个等价的(http://ipython.org/ipython-doc/dev/api/generated/IPython.parallel.client.view.html),所以它也适用于它。
修改强>
如果您使用第一个选项,则可以删除从最终列表中捕获异常(无,[]或bool(value) == False
)的任何结果,如下所示:
t1 = filter(None, c[:].map_sync(doCoolStuff, year,...))