Python 为什么可以';我抓到芹菜了吗;谁是工人?

Python 为什么可以';我抓到芹菜了吗;谁是工人?,python,celery,Python,Celery,我使用芹菜来设置使用结构的远程服务器 因此,每次出现问题时,我都希望将Server.status更改为Launching(以防止双重启动),将Server.status更改为Error。请看我的代码: class ChangeBackStatusOnErrorTask(celery.Task): abstract = True def on_failure(self, exc, task_id, args, kwargs, einfo): print 'from on_fail

我使用芹菜来设置使用结构的远程服务器

因此,每次出现问题时,我都希望将Server.status更改为Launching(以防止双重启动),将Server.status更改为Error。请看我的代码:

class ChangeBackStatusOnErrorTask(celery.Task):
  abstract = True

  def on_failure(self, exc, task_id, args, kwargs, einfo):
    print 'from on_failue', self, exc, task_id, args, kwargs, einfo
    return
    #server = Server.query.get(server_id)
    #server.status = RemoteStatus.ERROR
    #db.session.commit()


@celery.task(bind=True, base=ChangeBackStatusOnErrorTask)
def deploy_server(self, server_id):
  """To prevent launching while we are launching, we will
  disable launching until the server's status is LAUNCHED
  """
  server = Server.query.get(server_id)
  if not server.can_launch():
    return

  try:
    server.status = RemoteStatus.LAUNCHING
    db.session.commit()

    host = server.ssh_user + '@' + server.ip
    execute(fabric_deploy_server, self, server, hosts=host)

    server.status = RemoteStatus.LAUNCHED
    db.session.commit()
  except Exception as e:
    server.status = RemoteStatus.ERROR
    db.session.commit()
    traceback.print_exc()
    raise e
但是,当我向芹菜任务提供错误的ip地址时,我会遇到一个异常,绕过所有故障处理机制:

[2017-07-17 03:58:07,077: WARNING/PoolWorker-7] [root@1.2.3.45] Executing task 'fabric_deploy_server'
[2017-07-17 03:58:07,078: WARNING/PoolWorker-7] [root@1.2.3.45] sudo: apt-get update
[2017-07-17 03:58:17,173: WARNING/PoolWorker-7] Fatal error: Timed out trying to connect to 1.2.3.45 (tried 1 time)

Underlying exception:
    timed out
[2017-07-17 03:58:17,173: WARNING/PoolWorker-7] Aborting.
[2017-07-17 03:58:22,172: ERROR/MainProcess] Task handler raised error: WorkerLostError('Worker exited prematurely: exitcode 0.',)
Traceback (most recent call last):
  File "/Users/vng/.virtualenvs/AutomataHeroku/lib/python2.7/site-packages/billiard/pool.py", line 1224, in mark_as_worker_lost
    human_status(exitcode)),
WorkerLostError: Worker exited prematurely: exitcode 0.
如你所见

  • ChangeBackStatusOnErrorTask.on_失败时未调用
  • 这个例外逃脱了我的Try/Catch阵营

  • 我怎样才能抓住这个错误?我需要将Server.status设置为ERROR,以便重新启动任务

    从文档中,您应该可以从
    芹菜.result.result
    中获得
    芹菜.execute
    对象,因此即使失败,除非您告诉它,否则它也不会引发错误。我认为你也不需要通过赛尔夫来执行

    还执行类似于CayyY2的操作,您应该真正考虑更新。 试试这个

      try:
        server.status = RemoteStatus.LAUNCHING
        db.session.commit()
    
        host = server.ssh_user + '@' + server.ip
        # Apply will run locally.
        # http://docs.celeryproject.org/en/2.1-archived/reference/celery.execute.html#executing-tasks-celery-execute
        # Throw=True will re-raise the error if you get one.
        result = execute.apply(fabric_deploy_server, server, hosts=host, throw=True)
    
        server.status = RemoteStatus.LAUNCHED
        db.session.commit()
      except Exception as e:
        server.status = RemoteStatus.ERROR
        db.session.commit()
        traceback.print_exc()
        raise e
    
    芹菜


    芹菜渴望的结果

    这是什么版本的芹菜?(如果为3,则可能需要升级到4)。你的工作人员是如何死亡的,是得到一个术语信号/杀死还是只是崩溃?@lpiner我故意给它一个1.2.3.4到ssh,但它并不存在。这应该是法布里奇的一个错误。我试着回答,让我知道这是否有效。