Django 3.0 đang bổ sung hỗ trợ asgi / async và bảo vệ xung quanh việc thực hiện các yêu cầu đồng bộ trong ngữ cảnh không đồng bộ . Đồng thời, IPython chỉ cần thêm hỗ trợ async / await cấp cao nhất , dường như đang chạy toàn bộ phiên thông dịch bên trong một vòng lặp sự kiện mặc định.
Thật không may, sự kết hợp của hai bổ sung tuyệt vời này có nghĩa là bất kỳ thao tác ORM django nào trong máy tính xách tay jupyter đều gây ra SynchronousOnlyOperation
ngoại lệ:
SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Như thông báo ngoại lệ nói, có thể gói từng cuộc gọi ORM theo cách sync_to_async()
như sau:
images = await sync_to_async(Image.objects.all)()
nhưng nó không thuận tiện lắm, đặc biệt là đối với các trường liên quan thường được giải quyết ngầm khi tra cứu thuộc tính.
(Tôi đã thử dùng %autoawait off
phép thuật nhưng nó không hoạt động, từ cái nhìn thoáng qua vào các tài liệu tôi cho rằng đó là vì ipykernels luôn chạy trong một vòng lặp asyncio)
Vậy có cách nào để vô hiệu hóa đồng bộ hóa trong kiểm tra ngữ cảnh async trong django hoặc chạy ipykernel trong ngữ cảnh đồng bộ không?
Đối với ngữ cảnh: Tôi đã viết gói khoa học dữ liệu sử dụng django làm máy chủ phụ trợ nhưng cũng hiển thị giao diện dựa trên jupyter trên ORM cho phép bạn dọn dẹp / chú thích dữ liệu, theo dõi các thí nghiệm học máy và chạy tất cả các công việc đào tạo trong máy tính xách tay jupyter .
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
. Tôi đã thử bên trong jupyter và cũng được thêm vào settings.txt. BUt vẫn jupyter của tôi đang đưa ra lỗi