[英]Python 3 multiprocessing: internal and timeout error handling and callbacks
我试图使用Pool.starmap_async运行一些将多个参数作为输入的代码,以便快速扫过参数空间。 该代码运行一个linalg函数,该函数有时不收敛,而是引发np.linalg.LinAlgError。 在这种情况下,我希望我的代码返回np.nan并继续执行。 理想情况下,我还要指定一个超时时间,以使代码在设置的秒数后放弃,并继续进行不同的参数组合。
# This is actually some long function that sometimes returns a linalg error def run_solver(A, B): return A+B
if __name__ == '__main__':
# Parameters
Asearch = np.arange(4, 8, 1)
Bsearch = np.arange(0.2, 2, 0.2)
# Search all combinations of Qsearch and Rmsearch
AB = np.array(list(itertools.product(Qsearch, Rmsearch)))
A = AB[:, 0]
B = AB[:, 1]
result = {}
with Pool(processes=15) as pool:
def cb(r):
print("callback")
result[params] = r
def ec(r):
result[params] = np.nan
print("error callback")
raise np.linalg.LinAlgError
try:
params = (zip(A, B))
r = pool.starmap_async(run_solver, params, callback=cb, error_callback=ec)
print(r.get(timeout=10))
except np.linalg.LinAlgError:
print("parameters did not converge")
except mp.context.TimeoutError:
print("Timeout error. Continuing...")
pickle.dump(result, open("result.p", "wb"))
print("pickling output:", result)`
我试图将TimeoutError捕获为异常,以使代码继续运行,并且我有意提出LinAlgError,因为我试图在代码用完而时间未能收敛时进行区分-我意识到那是多余的。 一方面,结果字典并不能达到我的预期目的:有没有办法查询当前进程的参数并将其用作字典键? 另外,如果发生超时错误,我最好以某种方式标记这些参数-最好的方法是什么?
最后,为什么在此代码中回调仅被调用一次? 不应在每个过程成功完成时调用它吗? 该代码返回一个字典,其中所有参数都填充到一个键中(作为.zip文件),并且所有答案都是键值中的列表。
我认为我在这里并没有完全理解问题,但是如果将其简化为类似的东西,在计算函数中捕获LinAlgError
,该LinAlgError
?
这里apply_async
用于获取发送到池中的每个任务的结果对象。 这使您可以轻松地将超时应用于结果对象。
def run_solver(A, B):
try:
result = A + B
except np.linalg.LinAlgError:
result = np.nan
return result
results = []
with Pool(processes=15) as pool:
params = (zip(A, B))
result_pool = [pool.apply_async(run_solver, args) for args in params]
for result in result_pool:
try:
results.append(result.get(15))
except context.TimeoutError:
# do desired action on timeout
results.append(None)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.