Взаимоблокировка ошибок во время выполнения, возникающая случайным образом в Django

#django

Вопрос:

Запуск Django в Python 3.7.9. Я использую каналы, поэтому используется дафна, но даже при использовании gunicorn получаются те же результаты.

Ошибка ниже появляется случайным образом.

 ERROR        2021-07-12 11:55:07,478 HTTP GET /static/customer/assets/js/jquery.min.js 500 [0.71, 127.0.0.1:55466]
ERROR        2021-07-12 11:55:07,479 Exception inside application: Single thread executor already being used, would deadlock
Traceback (most recent call last):
  File "/home/x/.pyenv/versions/3.7.9/lib/python3.7/site-packages/channels/http.py", line 192, in __call__
    await self.handle(body_stream)
  File "/home/x/.pyenv/versions/3.7.9/lib/python3.7/site-packages/asgiref/sync.py", line 410, in __call__
    "Single thread executor already being used, would deadlock"
RuntimeError: Single thread executor already being used, would deadlock
 

Я не думаю, что эта ошибка имеет много общего с тупиком, но иногда они появляются вместе.

  ERROR        2021-07-12 11:55:07,478 HTTP GET
/static/customer/assets/js/jquery.min.js 500 [0.71, 127.0.0.1:55466]
 

Как я могу это решить?

Комментарии:

1. У меня нет точного ответа, но самая важная часть тупика, чтобы понять, какими ресурсами вы делитесь между потоками и когда? это означает, что порядок доступа к ресурсу1 и ресурсу2 в потоках имеет разный порядок. если вы расширите свой вопрос этой информацией, я бы предположил, что мы обнаружили проблему автоматически

2. @MikeLazko Ошибка происходит в классе SyncToAsync, который проверяет self.deadlock_context and self.deadlock_context.get(False) , self.thread_sensitive_context and self.thread_sensitive_context.get( None) , являются ли оба условия ложными, эта ошибка была вызвана . Я понятия не имею о порядке распределения ресурсов в потоках

3. Я предполагаю, что тупик связан с проблемой в вашем коде и ресурсах, которые приложение использует в качестве файлов (jquery.min.js). проверка выше просто подробно описывает, как lib обнаруживает тупик.

4. Также есть вторая операция(запрос), которая, вероятно, завершится успешно, но мы теряем ее из виду. Потому что lib решила выдать ошибку для запроса GET jquery.min.js. Попробуйте найти вторую операцию, и это станет причиной этой ошибки

Ответ №1:

Я исправил эту ошибку, понизив рейтинг asgiref:

requirements.txt

 asgiref==3.3.2
 

Комментарии:

1. Мне пришлось понизить рейтинг до asgiref==3.2.10 , я получил ошибку TypeError: async_to_sync can only be applied to async functions. от asgiref в вашей версии

2. Есть идеи , в чем причина ??

Ответ №2:

Я решил эту конкретную проблему (возникшую во время извлечения статических файлов), выполнив python manage.py collectstatic команду. Я предполагаю, что таким образом статические файлы не обслуживаются одним и тем же процессом. По крайней мере, это решает мою ошибку.