Как запустить/остановить сервер Hypercorn/Uvicorn в качестве фоновой задачи для асинхронного приложения (например, бота discord) Python

В настоящее время я создаю django приложение на asgi и у меня возникли проблемы с настройкой hypercorn и uvicorn для работы в фоновом режиме с изящным завершением работы. Когда я настраиваю свое приложение из asgi для запуска на hypercorn только с помощью asyncio.create_task и запускаю только его, сайт не запускается.

Фрагмент кода Гиперкорна:

Сниппет кода Uvicorn:

import sys
sys.path.insert(1, 'C:\\Users\\Sub01\\Project\\PaulWebsite\\app')
import asyncio
from paul_site.asgi import application
import signal
import time
import uvicorn
from multiprocessing import Process

class UvicornServer(uvicorn.Server):
    
    def __init__(self, host: str = "127.0.0.1", port: int = 8000):
        self.host = host
        self.port = port
    
    async def setup(self):
        self.proc = Process(
            target=uvicorn.run,
            args=[application],
            kwargs={
                'host': self.host,
                'port': self.port,
            },
            daemon=True
        )
        # self.proc.run()
        await self.proc.start()
        await asyncio.sleep(0.5)
    
    async def down(self):
        self.proc.terminate()

def blockingFunc():
    prevTime = time.time()
    while True:
        print("Elapsed time: ", time.time() - prevTime)
        time.sleep(1)
        if time.time() - prevTime >= 4:
            break

async def main():
    server = UvicornServer()
    await server.setup()
    blockingFunc()
    await server.down()

asyncio.run(main())

Asgi.py:

"""
ASGI config for paul_site project.

It exposes the ASGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/4.1/howto/deployment/asgi/
"""

import os

from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application

from paul_site_app.ws_urlpatterns import ws_urlpatterns

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'paul_site.settings')

application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': URLRouter(ws_urlpatterns)
})

Посмотрев на примеры людей, использующих FastAPI и запускающих uvicorn в качестве фоновой задачи, я попробовал это, но это приводит только к ошибке времени выполнения. Я также пробовал командой открывать терминал и запускать приложение через cli, но вскоре понял, что код, вызывающий новый терминал, не совместим с разными платформами.

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