使用map_sync进行python多处理 - 捕获问题

时间:2014-04-28 14:55:08

标签: python multiprocessing

我尝试在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) )

有些时候,有一天缺少/不完整的数据。当发生这种情况时,它会杀死其他节点上的所有进程。有没有办法捕捉这些实例?我不确定尝试/除了在这里工作。

由于

1 个答案:

答案 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,...))