O Django 3.0 está adicionando suporte ao asgi / async e, com ele, guarda solicitações síncronas em um contexto assíncrono . Simultaneamente, o IPython acabou de adicionar suporte a nível assíncrono / aguardado , que parece estar executando toda a sessão do intérprete dentro de um loop de eventos padrão.
Infelizmente, a combinação desses dois grandes acréscimos significa que qualquer operação django ORM em um notebook jupyter causa uma SynchronousOnlyOperation
exceção:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Como a mensagem de exceção diz, é possível agrupar cada chamada ORM da seguinte maneira sync_to_async()
:
images = await sync_to_async(Image.objects.all)()
mas não é muito conveniente, especialmente para campos relacionados que normalmente seriam resolvidos implicitamente na pesquisa de atributos.
(Tentei %autoawait off
magia, mas não funcionou; de uma rápida olhada nos documentos , presumo que seja porque os ipykernels sempre rodam em um loop assíncrono)
Portanto, existe uma maneira de desativar a sincronização no contexto assíncrono no django ou executar um ipykernel em um contexto síncrono?
Por contexto: escrevi um pacote de ciência de dados que usa o django como servidor back-end, mas também expõe uma interface baseada em jupyter na parte superior do ORM, que permite limpar / anotar dados, rastrear experimentos de aprendizado de máquina e executar trabalhos de treinamento em um notebook jupyter .
fonte
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Eu tentei dentro do jupyter e também adicionei ao settings.py. Ainda meu jupyter está dando erroPor enquanto, planejo usar apenas uma versão bifurcada do django com uma nova configuração para ignorar a verificação async_unsafe . Quando o ORM obtiver suporte assíncrono, provavelmente terei que reescrever meu projeto para apoiá-lo e soltar a bandeira.
EDIT: agora existe um PR para adicionar uma variável env (
DJANGO_ALLOW_ASYNC_UNSAFE
) para desativar a verificação ( https://github.com/django/django/pull/12172 )fonte