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 .
quelle
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 FehlerIm Moment habe ich vor, nur eine gegabelte Version von Django mit einer neuen Einstellung zu verwenden, um die Prüfung async_unsafe zu überspringen . Sobald der ORM asynchrone Unterstützung erhält, muss ich wahrscheinlich mein Projekt neu schreiben, um es zu unterstützen und das Flag zu löschen.
BEARBEITEN: Es gibt jetzt eine PR, um eine env-Variable (
DJANGO_ALLOW_ASYNC_UNSAFE
) hinzuzufügen , um die Prüfung zu deaktivieren ( https://github.com/django/django/pull/12172 ).quelle