jdo*_*dot 19 python heroku rabbitmq celery sigterm
我对此做了大量的研究,我很惊讶我还没有找到一个好的答案.
我正在Heroku上运行一个大型应用程序,我有一些芹菜任务运行了很长时间的处理,并在任务结束时保存结果.每次我在Heroku上重新部署时,它都会发送SIGTERM(最终是SIGKILL)并杀死我的跑步工作者.我正在尝试找到一种方法让worker实例优雅地自行关闭并重新排队以便稍后处理,这样最终我们可以保存所需的结果而不是丢失排队的任务.
我找不到一种让工作人员正确地监听SIGTERM的方法.我得到的最接近的,在python manage.py celeryd直接运行时有效但在使用工头模拟Heroku时没有,如下:
@app.task(bind=True, max_retries=1)
def slow(self, x):
try:
for x in range(100):
print 'x: ' + unicode(x)
time.sleep(10)
except exceptions.MaxRetriesExceededError:
logger.error('whoa')
except (exceptions.WorkerShutdown, exceptions.WorkerTerminate) as exc:
logger.error(u'retrying, ' + unicode(exc))
raise self.retry(exc=exc, countdown=10)
except (KeyboardInterrupt, SystemExit) as exc:
print 'retrying'
raise self.retry(exc=exc, countdown=10)
else:
return x
finally:
logger.info('task ended!')
Run Code Online (Sandbox Code Playgroud)
当我开始在领班内运行芹菜任务并按Ctrl + C时,会发生以下情况:
^CSIGINT received
22:20:59 system | sending SIGTERM to all processes
22:20:59 web.1 | exited with code 0
22:21:04 system | sending SIGKILL to all processes
Killed: 9
Run Code Online (Sandbox Code Playgroud)
所以,很显然,没有一个例外的芹菜,也没有的KeyboardInterrupt或者SystemExit我在其他帖子看到异常,适当地捕捉SIGTERM和关闭工作.
这样做的正确方法是什么?
从版本 >= 4 开始,Celery 附带了一个专门针对 Heroku 的特殊功能,可以开箱即用地支持此功能:
$ REMAP_SIGTERM=SIGQUIT celery -A proj worker -l info
Run Code Online (Sandbox Code Playgroud)
来源:https://devcenter.heroku.com/articles/celery-heroku#using-remap_sigterm
| 归档时间: |
|
| 查看次数: |
1518 次 |
| 最近记录: |