python - asyncio.run(和其他风格)无法从 Celery 中的异常中恢复
问题描述
我正在使用 Celery 作为零星任务的工人。我需要从我的任务中调用的库都是异步的,我尝试了各种方法来让它工作。
它主要工作,除非我运行的任务引发异常。它很好地记录了异常,但是下次它抓取任务时,它会出错,说“事件循环已关闭”(如果任务正确完成,则不会发生这种情况)。
我尝试了以下口味,结果都一样;
@app.task
def score_survey(sku, auto_push=False):
async_to_sync(score_survey_handler)(sku, auto_push)
@app.task
def score_survey(sku, auto_push=False):
asyncio.run(score_survey_handler(sku, auto_push))
@app.task
def score_survey(sku, auto_push=False):
loop = asyncio.new_event_loop()
task = loop.create_task(score_survey_handler(sku, auto_push))
try:
loop.run_until_complete(task)
except:
task.exception()
task.cancel()
raise
finally:
loop.stop()
loop.close()
@app.task
def score_survey(sku, auto_push=False):
loop = asyncio.new_event_loop()
loop.run_until_complete(score_survey_handler(sku, auto_push))
所有完全相同的行为;只要score_survey_handler
完成没有任何问题,它就可以正常工作,但是一旦它抛出异常,Celery 接受的下一个任务就会抛出一个异常,表示事件循环已关闭。
我也试过只使用异常而不是在 Celery 任务中引发它们,这也有效 - 但我确实需要将异常记录到 Celery 结果后端,所以这远非理想。
知道我怎样才能让它工作吗?或者为什么即使我打电话也不起作用new_event_loop()
?
解决方案
推荐阅读
- java - 在 Java 中,允许程序向 CMD.exe 发送命令的小帮助
- mysql - 如何从表中找到每个值的唯一计数?
- .net - 如何避免 sql server 代理中的凭据弹出 powershell 窗口?
- powershell - 列出 PowerShell 中的所有服务
- ruby - 我有一个带有参数的对象数组(在哈希中)。如何列出每个对象的所有参数?
- html - 为什么那个边框不覆盖它的内容
- java - 如何清理带有太多 if/else java 的代码
- python - 安装 tensorflow 时出现 Pip 错误:没有磁盘空间
- cookies - 如何在 ASP.NET 4.6.1 及以下版本中支持 SameSite Cookie
- json - “int”类型不是“double”类型的子类型(颤振)