Django 3.0 fügt Asgi / Async-Unterstützung hinzu und schützt damit synchrone Anforderungen in einem asynchronen Kontext . Gleichzeitig hat IPython gerade die asynchrone / wartende Unterstützung der obersten Ebene hinzugefügt , die anscheinend die gesamte Interpretersitzung innerhalb einer Standardereignisschleife ausführt.
Leider bedeutet die Kombination dieser beiden großartigen Zusätze, dass jede Django-ORM-Operation in einem Jupyter-Notebook eine SynchronousOnlyOperation
Ausnahme verursacht:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Wie in der Ausnahmemeldung angegeben, ist es möglich, jeden ORM-Aufruf sync_to_async()
wie folgt zu verpacken :
images = await sync_to_async(Image.objects.all)()
Dies ist jedoch nicht sehr praktisch, insbesondere für verwandte Felder, die normalerweise bei der Attributsuche implizit aufgelöst werden.
(Ich habe %autoawait off
Magie ausprobiert, aber es hat nicht funktioniert. Nach einem kurzen Blick auf die Dokumente gehe ich davon aus, dass ipykernels immer in einer Asyncio-Schleife ausgeführt werden.)
Gibt es also eine Möglichkeit, entweder die Synchronisierung in der asynchronen Kontextprüfung in Django zu deaktivieren oder einen Ipykernel in einem synchronen Kontext auszuführen?
Zum Kontext: Ich habe ein Data Science-Paket geschrieben, das Django als Backend-Server verwendet, aber auch eine auf Jupyter basierende Schnittstelle über dem ORM bereitstellt, mit der Sie Daten bereinigen / kommentieren, Experimente zum maschinellen Lernen verfolgen und Schulungsjobs in einem Jupyter-Notizbuch ausführen können .
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Ich habe es in jupyter versucht und auch zu settings.py hinzugefügt. Aber immer noch gibt mein Jupiter Fehler