我的Celery任务引发了一个自定义异常NonTransientProcessingError,然后被捕获AsyncResult.get().Tasks.py:
class NonTransientProcessingError(Exception):
pass
@shared_task()
def throw_exception():
raise NonTransientProcessingError('Error raised by POC model for test purposes')
Run Code Online (Sandbox Code Playgroud)
在Python控制台中:
from my_app.tasks import *
r = throw_exception.apply_async()
try:
r.get()
except NonTransientProcessingError as e:
print('caught NonTrans in type specific except clause')
Run Code Online (Sandbox Code Playgroud)
但我的自定义异常是,虽然引发的异常是,所以我的子句失败了.my_app.tasks.NonTransientProcessingErrorAsyncResult.get()celery.backends.base.NonTransientProcessingErrorexcept
Traceback (most recent call last):
File "<input>", line 4, in <module>
File "/...venv/lib/python3.5/site-packages/celery/result.py", line 175, in get
raise meta['result']
celery.backends.base.NonTransientProcessingError: Error raised by POC model for test purposes
Run Code Online (Sandbox Code Playgroud)
如果我在任务中捕获异常,它可以正常工作.只有当异常被提升到.get()调用时才重命名.
如何引发自定义异常并正确捕获? …
我仍然对asyncio如何工作感到困惑,所以我试图设置一个简单的例子但是无法实现它.
以下示例是一个Web服务器(Quart),它接收生成大型PDF的请求,然后服务器在开始处理PDF之前返回响应,然后开始处理它,并稍后将下载链接发送到电子邮件.
from quart import Quart
import asyncio
import time
app = Quart(__name__)
@app.route('/')
async def pdf():
t1 = time.time()
await generatePdf()
return 'Time to execute : {} seconds'.format(time.time() - t1)
async def generatePdf():
await asyncio.sleep(5)
#sync generatepdf
#send pdf link to email
app.run()
Run Code Online (Sandbox Code Playgroud)
我该怎么做?在上面的例子中,我不希望在返回之前等待5秒.
我甚至不确定asyncio是否是我需要的.
我担心在响应返回后阻止服务器应用程序不是应该做的事情,但也不确定.
此外,pdf库是同步的,但我想这是另一天的问题......