Uwsgi worker зависает при выходе, но только если он использовал модуль async trio

У меня есть Django-сайт, который использует пакет trio_cdp для генерации PDF-файлов с помощью безголового Google Chrome. Этот пакет является async, но мой проект Django - sync, поэтому он должен запускаться внутри trio.run()

В нем также используются блокировки uwsgi, чтобы только один клиент мог генерировать PDF одновременно (безголовый Chrome загружает страницу в одной виртуальной вкладке, поэтому он может делать только одну за раз)

Вот код:

import trio
import base64
import requests
from django.conf import settings
from trio_cdp import open_cdp, page, target

try:
    import uwsgi
    have_uwsgi = True
except ModuleNotFoundError:
    have_uwsgi = False

async def render_pdf_task(url, params):
    r = requests.get(url=settings.CDP_URL)
    if r.status_code == 200:
        out = r.json()
        ws_url = out[0]['webSocketDebuggerUrl']
    else:
        return None
    async with open_cdp(ws_url) as conn:
        targets = await target.get_targets()
        target_id = targets[0].target_id
        async with conn.open_session(target_id) as session:
            async with session.page_enable():
                async with session.wait_for(page.LoadEventFired):
                    await page.navigate(url)
                await trio.sleep(0.5)
                pdf = await page.print_to_pdf(**params)
                pdfdata = base64.b64decode(pdf[0])
        await conn.aclose()
    return pdfdata

def render_pdf(url, params):
    if have_uwsgi:
        uwsgi.lock(1)
    pdfdata = trio.run(render_pdf_task, url, params)
    if have_uwsgi:
        uwsgi.unlock(1)
    return pdfdata

Как ни неприятно, любой рабочий uwsgi, выполнивший это конкретное задание, впоследствии будет висеть на выходе, пока его не убьют принудительно. Если uwsgi запущен и никто не заходит на страницу, генерирующую PDF, все рабочие uwsgi выходят нормально. И только рабочие uwsgi, выполнявшие функцию render_pdf, должны быть убиты.

Например, pid 20887 запустил render_pdf, и позже при попытке выключить uwsgi произошло следующее:

SIGINT/SIGQUIT received...killing workers...
worker 10 buried after 1 seconds
worker 9 buried after 1 seconds
worker 7 buried after 1 seconds
worker 6 buried after 1 seconds
worker 5 buried after 1 seconds
worker 4 buried after 1 seconds
worker 3 buried after 1 seconds
worker 2 buried after 1 seconds
worker 1 buried after 1 seconds
Tue Jan 25 22:44:42 2022 - worker 8 (pid: 20887) is taking too much time to die...NO MERCY !!!
worker 8 buried after 1 seconds
goodbye to uWSGI.

Как я могу это исправить? Любая помощь будет очень признательна :)

<<<Я смог решить эту проблему самостоятельно. Обработчик uWSGI для

переопределяется SIGINT, но только если trio.run() находится в главном потоке. Я решил эту проблему, запустив его в другом потоке.trio.run()

Вернуться на верх