Хорошо, поэтому, во-первых, есть недоразумение.Это
async def getPdf(request):
asyncio.create_task(renderPdfsInExecutor(request.json))
...
async def renderPdfsInExecutor(json):
asyncio.get_running_loop.run_in_executor(executor, syncRenderPdfs, json)
является избыточным.Достаточно сделать
async def getPdf(request):
asyncio.get_running_loop.run_in_executor(executor, syncRenderPdfs, request.json)
...
или (поскольку вы не хотите ждать) еще лучше
async def getPdf(request):
executor.submit(syncRenderPdfs, request.json)
...
Теперь проблема, которую вы получаете, заключается в том, что syncRenderPdfs
throws PermissionError
,Он не обрабатывается, поэтому Python предупреждает вас: «Привет, какой-то фоновый код выдал ошибку. Но этот код никем не принадлежит, так что, черт возьми?».Вот почему вы получаете Future exception was never retrieved
. У вас проблема с самой библиотекой pdf , а не с asyncio.После того, как вы исправите эту внутреннюю проблему, это также хорошая идея, чтобы быть в безопасности:
def syncRenderPdfs(json)
try:
#Some PDF Library that downloads images synchronously
pdfs = somePdfLibrary.generatePdfsFromJson(json)
sendToDefaultMail(pdfs)
except Exception:
logger.exception('Something went wrong') # or whatever
Ваша проблема с «отказом в разрешении» - это совсем другое дело, и вы должны отладить ее и / или опубликовать отдельный вопрос для этого.
Что касается последнего вопроса: да, исполнитель будет ставить в очередь и равномерно распределять задачи между работниками.
РЕДАКТИРОВАТЬ: Как мы уже говорили в комментариях, реальная проблема можетбыть в среде Windows, в которой вы работаете.Или, точнее, с ProcessPoolExecutor, т.е. процессы нереста могут изменять разрешения.Я советую использовать ThreadPoolExecutor, предполагая, что он отлично работает на платформе.