【发布时间】:2019-02-18 14:17:06
【问题描述】:
我怎样才能设置一个阻塞函数在执行器中运行,结果并不重要,所以主线程不应该等待或被它拖慢。
说实话,我不确定这是否是正确的解决方案,我想要的只是将某种类型的处理队列与主进程分开,这样它就不会阻止服务器应用程序返回请求,因为这种类型的 Web 服务器为多个请求运行一个工作器。
我最好远离像 Celery 这样的解决方案,但如果这是最理想的,我愿意学习它。
这里的上下文是一个异步网络服务器,它生成带有大图像的 pdf 文件。
app = Sanic()
#App "global" worker
executor = ProcessPoolExecutor(max_workers=5)
app.route('/')
async def getPdf(request):
asyncio.create_task(renderPdfsInExecutor(request.json))
#This should be returned "instantly" regardless of pdf generation time
return response.text('Pdf being generated, it will be sent to your email when done')
async def renderPdfsInExecutor(json):
asyncio.get_running_loop.run_in_executor(executor, syncRenderPdfs, json)
def syncRenderPdfs(json)
#Some PDF Library that downloads images synchronously
pdfs = somePdfLibrary.generatePdfsFromJson(json)
sendToDefaultMail(pdfs)
上面的代码给出了错误(是的,它以管理员身份运行):
PermissionError [WinError 5] Access denied
Future exception was never retrieved
额外的问题:通过在执行程序中运行异步循环,我能获得什么吗?因此,如果它一次处理多个 PDF 请求,它将在它们之间分配处理。如果是,我该怎么做?
【问题讨论】:
-
如果我等待
run_in_executor,它不会阻塞主循环,但我会阻止函数/响应“立即”返回 -
@freakish 它不会阻塞循环,但会阻塞
getPdf函数,因为它正在等待,至少当我直接测试时是这样的
标签: python python-3.x python-asyncio python-3.7 sanic