Django 3.0 dodaje obsługę asgi / async, a wraz z nią pilnuje wykonywania synchronicznych żądań w kontekście asynchronicznym . Jednocześnie IPython dodał właśnie obsługę asynchronizacji / oczekiwania na najwyższy poziom , która wydaje się uruchamiać całą sesję interpretera w domyślnej pętli zdarzeń.
Niestety połączenie tych dwóch wspaniałych dodatków oznacza, że każda operacja ORM django w notatniku jupyter powoduje SynchronousOnlyOperation
wyjątek:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Jak mówi komunikat wyjątku, możliwe jest zawinięcie każdego wywołania ORM w sync_to_async()
podobny sposób:
images = await sync_to_async(Image.objects.all)()
ale nie jest to zbyt wygodne, szczególnie w przypadku powiązanych pól, które zwykle byłyby domyślnie rozwiązane podczas wyszukiwania atrybutów.
(Próbowałem %autoawait off
magii, ale to nie zadziałało, od szybkiego spojrzenia na dokumenty, które zakładam, ponieważ ipykernels zawsze działa w pętli asyncio)
Czy jest więc sposób na wyłączenie synchronizacji w asynchronicznym sprawdzaniu kontekstu w django lub uruchomienie ipykernel w kontekście synchronicznym?
Dla kontekstu: napisałem pakiet do nauki danych, który wykorzystuje django jako serwer zaplecza, ale także udostępnia interfejs oparty na jupyter na ORM, który pozwala na czyszczenie / adnotacje danych, śledzenie eksperymentów uczenia maszynowego i uruchamianie zadań szkoleniowych w notatniku jupyter .
źródło
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Próbowałem wewnątrz jupyter i również dodałem do settings.py. Ale nadal mój jupter daje błądNa razie planuję po prostu użyć rozwidlonej wersji django z nowym ustawieniem, aby pominąć sprawdzanie async_unsafe . Gdy ORM uzyska wsparcie asynchroniczne, prawdopodobnie będę musiał przepisać mój projekt, aby go obsługiwać i upuścić flagę.
EDYCJA: teraz jest PR, aby dodać zmienną env (
DJANGO_ALLOW_ASYNC_UNSAFE
), aby wyłączyć sprawdzanie ( https://github.com/django/django/pull/12172 )źródło