带有映射同步捕获问题的python多处理

带有映射同步捕获问题的python多处理,python,multiprocessing,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) mon

我正在尝试使用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[:]。地图同步(doCoolStuff、年、月、日、小时、年、[options]*len(日))

有时某一天的数据丢失/不完整。当这种情况发生时,它会终止其他节点上的所有进程。有没有办法捕捉这些实例?我不确定“尝试/例外”在这里是否有效


谢谢

我在这里可以想到两种选择。一个是确保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确实有一个等价的(),因此它也应该适用于该模块

编辑: 如果使用第一个选项,则可以从最终列表中删除捕获异常时返回的任何结果(无、[]或任何其他值,其中
bool(value)==False
),如下所示:

t1 = filter(None, c[:].map_sync(doCoolStuff, year,...))

我不明白你到底在说什么。您说您正在使用“map_sync”,但这不是有效的池方法。您正在使用map\u async吗?您传递给它的参数似乎表明您实际使用的是apply\u async,因为第二个参数(year)看起来不是一个iterable。感谢您签入。。。。传入的变量(年、月、日、小时和NEN)都具有相同的长度(年=年*len(天)*len(小时))。在这里的示例中,每个都是一个长度为40的列表。好吧。。我仍然对
c[:].map\u sync(
)有点困惑。c和map\u sync是在哪里定义的?它们在块中定义的,就在我从IPython提供的代码“code”之前。并行导入客户机c=Client(profile='default')dview=c[:]dview.apply_-sync(lambda:“起始节点!”)打印dview.apply_-sync(lambda:“起始节点!”)哦,您使用的是IPython.parallel,而不是Python多处理模块。这就是为什么您的调用看起来不正确的原因。我有一个多处理模块的解决方案,但我以前从未使用过IPython.parallel,快速查看一下他们的API,就会发现他们没有与我的解决方案使用的多处理模块等效的解决方案。我会看看是否可以使用IPython.parallel.ink的另一种方式。谢谢。我使用了你第二个建议的变体,没有任何问题。但是我想解决并行问题。“doCoolStuff”不会引发异常。它返回一个信息列表。编写的代码会获取传入的日期信息,并读取带有该日期的文件…然后执行该操作。我假设问题是,有时文件会丢失或不完整。我想我可以添加一个try/except to docoolstup,它返回空列表。只是澄清一下,您是说doCoolStuff不会直接引发任何异常(意味着您实际上没有在任何地方编写
raiseexception(…)
,但在运行时引发异常,因为它试图处理的文件丢失/不完整?正确。在任何地方都不会调用“引发异常”或“尝试/除外”。好的,如果您希望阻止任何异常离开doCoolStuff,并保持映射调用的方式,您也可以这样做。我将编辑我的答案以显示h现在你可以做的是过滤掉doCoolStuff中捕获异常时返回的空列表。期待着。