Сельдерей, запущенный в контексте asyncio

#django #celery #python-asyncio #django-channels

#джанго #сельдерей #python-asyncio #джанго-каналы

Вопрос:

Я запускаю приложение Django, которое использует каналы и Сельдерей. У меня возникла недетерминированная проблема, из-за которой иногда мои задачи с сельдереем запускаются из цикла событий asyncio.

Я получаю такие ошибки, как это:

 [2021-12-08 20:02:23,699: ERROR/MainProcess] Signal handler lt;function switch_schema at 0x7f1ce3c09d30gt; raised: SynchronousOnlyOperation('You cannot call this from an async context - use a thread or sync_to_async.') Traceback (most recent call last):  File "/usr/local/lib/python3.8/site-packages/celery/utils/dispatch/signal.py", line 276, in send  response = receiver(signal=self, sender=sender, **named)  File "/usr/local/lib/python3.8/site-packages/tenant_schemas_celery/app.py", line 48, in switch_schema  tenant = task.get_tenant_for_schema(schema_name=schema)  File "/usr/local/lib/python3.8/site-packages/tenant_schemas_celery/task.py", line 43, in get_tenant_for_schema  cached_value = get_tenant_model().objects.get(schema_name=schema_name)  File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method  return getattr(self.get_queryset(), name)(*args, **kwargs)  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 431, in get  num = len(clone)  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 262, in __len__  self._fetch_all()  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1324, in _fetch_all  self._result_cache = list(self._iterable_class(self))  File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 51, in __iter__  results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)  File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1173, in execute_sql  cursor = self.connection.cursor()  File "/usr/local/lib/python3.8/site-packages/django/utils/asyncio.py", line 31, in inner  raise SynchronousOnlyOperation(message) django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.  

Это не всегда происходит, и это не всегда приводит к одной и той же линии.
Кто-нибудь знает, почему это происходит и как это предотвратить?