Как запустить/остановить сервер 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, но вскоре понял, что код, вызывающий новый терминал, не совместим с разными платформами.