Замерзание кода Django при использовании Daphne для асинхронных запросов к базе данных
Я запускаю асинхронное приложение django, которое загружает некоторые данные. Поскольку я хочу, чтобы загрузка выполнялась асинхронно, я определил некоторые асинхронные методы для запуска в качестве корутинов. Эти методы иногда содержат запросы Django ORM, которые я также запускаю асинхронно (например, цикл async for, sync_to_async или .aget()). Поскольку я хочу отображать прогресс загрузки в браузере клиента в реальном времени, я установил django-channels вместе с daphne, чтобы настроить websockets. Однако, если я запускаю код без daphne, все работает идеально. Но как только я регистрирую daphne как app в settings.py (что runserver фактически запускает daphne serevr), код застревает на async запросе к базе данных.
Более подробная информация:
settings.py:
ASGI_APPLICATION = 'MultiClaw.asgi.application'
INSTALLED_APPS = [
'daphne',
...
]
Вид, который отображается на кнопку, запускающую загрузку:
@csrf_exempt
def start_grab_thread(request):
parser_name = request.POST['parser_name']
settings_model = Settings.objects.filter(user=request.user, parser_name=parser_name)[0]
parser_module = importlib.import_module(f'parser.Parser.{parser_name}')
parser_class = getattr(parser_module, parser_name)
parser_instance: Core = parser_class(settings_model)
asyncio.run(parser_instance.download_products())
if request.method == "POST":
return redirect('start')
функция, в которой возникает проблема:
async def download_products(self):
print('downloading products')
collected_product_urls = self.product_url_list
print(f'{collected_product_urls=}')
product_urls_from_db = set([
product.source_url async for product in
Product.objects
.filter(pk__in=collected_product_urls)
])
print(f'{product_urls_from_db=}')
print(f'FINALLY GOT IT')
return
Я перепробовал множество попыток, обернул запрос в функцию, украсил ее database_sync_to_async, async_to_sync...
Я также определил тестовую функцию с asyncio.sleep(1), чтобы проверить, не работает ли await в целом.
Но я понял, что только асинхронные запросы к базе данных не работают.
Код просто останавливается. Кажется, что что-то блокирует выполнение запроса к базе данных. У меня нет ошибок, я просто не могу понять, что происходит, что он просто застревает там навсегда, и я никогда не могу увидеть этот вывод 'FINALLY GOT IT', когда сервер daphne запущен.
Надеюсь, вы поможете мне исправить это, спасибо большое!