Django 3.0 menambahkan dukungan asgi / async dan dengan itu menjaga sekitar membuat permintaan sinkron dalam konteks async . Bersamaan dengan itu, IPython baru saja menambahkan dukungan async / menunggu tingkat atas , yang tampaknya menjalankan seluruh sesi juru bahasa di dalam perulangan acara standar.
Sayangnya kombinasi dari kedua tambahan yang hebat ini berarti bahwa setiap operasi ORM django di notebook jupyter menyebabkan SynchronousOnlyOperation
pengecualian:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Seperti yang dikatakan pesan pengecualian, mungkin untuk membungkus setiap panggilan ORM dalam sync_to_async()
seperti:
images = await sync_to_async(Image.objects.all)()
tapi itu tidak terlalu nyaman, terutama untuk bidang terkait yang biasanya diselesaikan secara implisit pada pencarian atribut.
(Saya mencoba %autoawait off
sihir tetapi tidak berhasil, dari pandangan cepat ke dokumen saya berasumsi itu karena ipykernels selalu berjalan dalam loop asyncio)
Jadi apakah ada cara untuk menonaktifkan sinkronisasi di async context check di Django atau menjalankan ipykernel dalam konteks sinkron?
Untuk konteks: Saya menulis paket sains data yang menggunakan Django sebagai server backend tetapi juga memperlihatkan antarmuka berbasis jupyter di atas ORM yang memungkinkan Anda untuk membersihkan / membubuhi keterangan data, melacak eksperimen pembelajaran mesin dan menjalankan pekerjaan pelatihan di notebook jupyter .
sumber
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Saya mencoba di dalam jupyter dan juga menambahkan ke settings.py. Tapi tetap saja jupyter saya memberikan kesalahanUntuk saat ini saya berencana hanya menggunakan versi django bercabang dua dengan pengaturan baru untuk melewati pemeriksaan async_unsafe . Setelah ORM mendapatkan dukungan async saya mungkin harus menulis ulang proyek saya untuk mendukungnya dan menjatuhkan flag.
EDIT: sekarang ada PR untuk menambahkan variabel env (
DJANGO_ALLOW_ASYNC_UNSAFE
) untuk menonaktifkan cek ( https://github.com/django/django/pull/12172 )sumber