如何忽略任务失败的工作人员,并将其任务重新分配给其他工作人员?

2024-09-29 17:16:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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

Tags: importclientmapreturn进程mydefsys
1条回答
网友
1楼 · 发布于 2024-09-29 17:16:42

作为一种解决方法,您可以保留一个坏worker字典,每次确定坏worker时(可能在它引发一定数量的异常之后)都将主机名添加到字典中

当你想发布某个任务时,检查它是否在违规列表中。比如:

  if socket.gethostname() in badHosts:
    skip
  else:
    do_something()

如果您能提供更多关于如何管理连接到的池的详细信息,我可能会提供更多关于如何直接删除它们的建议,而不必每次都进行检查

相关问题 更多 >

    热门问题