Python 为什么可以';我抓到芹菜了吗;谁是工人?
我使用芹菜来设置使用结构的远程服务器 因此,每次出现问题时,我都希望将Server.status更改为Launching(以防止双重启动),将Server.status更改为Error。请看我的代码: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
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_失败时未调用
李>
我怎样才能抓住这个错误?我需要将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,但它并不存在。这应该是法布里奇的一个错误。我试着回答,让我知道这是否有效。