我使用client.map在N个单线程工作线程池(在N台计算机上)上运行函数,其中一个工作线程失败。我想知道是否有一种方法可以自动处理一个工作进程引发的异常,将其失败的任务重新分配给其他工作进程,并将其忽略或从池中排除
我试着用下面所示的方法来模拟这个问题。为了使一个工作进程失败,我在my_function
中对它引发一个OSError,它被提交给client.map
,如下:futures = client.map(my_function, range(100))
。在我的例子中,“Computer123”上的工人将是失败的工人。为了处理my_function
引发的异常,我在exception_handler
中使用sys.exit。因此,当工作进程上的任务失败时,将调用sys.exit。结果是坏的worker的distributed.nanny捕获失败并重新启动worker,同时客户端重新分配失败的任务。但是,一旦坏工人再次回来,它会再次收到任务,因为它仍然在池中。它再次失败,过程重复。当它继续失败时,最终其他工人完成了所有的任务。如果我能自动处理诸如“Computer123”之类的坏工人的异常并将其从池中删除,那将是非常理想的。也许我只需要把它从游泳池里拿出来
@exception_handler
def my_function(x):
import socket
import time
time.sleep(5)
if socket.gethostname() == 'Computer123':
raise(OSError)
else:
return x**2
def exception_handler(orig_func):
def wrapper(*args,**kwargs):
try:
return orig_func(*args,**kwargs)
except:
import sys
sys.exit(1)
return wrapper
作为一种解决方法,您可以保留一个坏worker字典,每次确定坏worker时(可能在它引发一定数量的异常之后)都将主机名添加到字典中
当你想发布某个任务时,检查它是否在违规列表中。比如:
如果您能提供更多关于如何管理连接到的池的详细信息,我可能会提供更多关于如何直接删除它们的建议,而不必每次都进行检查
相关问题 更多 >
编程相关推荐