如何设置阻塞函数以在执行程序中运行,结果无关紧要,因此主线程不应该等待或被它拖慢。
老实说,我不确定这是否是正确的解决方案,我想要的只是将某种类型的处理队列与主进程分开,这样它就不会阻止服务器应用程序返回请求,因为这样Web 服务器类型为许多请求运行一个工作人员。
最好我想远离像 Celery 这样的解决方案,但如果这是最优化的,我愿意学习它。
这里的上下文是一个异步 Web 服务器,它生成带有大图像的 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
奖励问题:通过在执行程序中运行 asyncio 循环,我能获得什么吗?因此,如果它一次处理多个 PDF 请求,它将在它们之间分配处理。如果是,我该怎么做?