频道消费者在 Django 中阻止正常的 HTTP?
Channels consumer blocks normal HTTP in Django?
我运行在本地安装一个开发服务器
python manage.py runserver 8000
然后我运行一个消费下面Consumer的脚本
from channels.generic.websocket import AsyncJsonWebsocketConsumer
class MyConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
import time
time.sleep(99999999)
await self.accept()
一切运行都很好,消费者如预期的那样睡了很长时间。但是我无法从浏览器访问 http://127.0.0.1:8000/。
现实生活中这个问题更大,因为消费者需要向同一台服务器发出 HTTP 请求 - 最终陷入僵局。
这是预期的行为吗?如何允许在缓慢的消费者 运行ning 时调用我的服务器?
因为这是一个 async
函数,您应该使用 asyncio
的 sleep
。
import asyncio
from channels.generic.websocket import AsyncJsonWebsocketConsumer
class MyConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
await asyncio.sleep(99999999)
await self.accept()
如果您使用 time.sleep
,您将 sleep
整个 python 线程。
这也适用于当您发出上游 HTTP 请求时需要使用 asyncio
http 库而不是同步库。 (基本上你应该等待任何预计需要的时间)
我运行在本地安装一个开发服务器
python manage.py runserver 8000
然后我运行一个消费下面Consumer的脚本
from channels.generic.websocket import AsyncJsonWebsocketConsumer
class MyConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
import time
time.sleep(99999999)
await self.accept()
一切运行都很好,消费者如预期的那样睡了很长时间。但是我无法从浏览器访问 http://127.0.0.1:8000/。
现实生活中这个问题更大,因为消费者需要向同一台服务器发出 HTTP 请求 - 最终陷入僵局。
这是预期的行为吗?如何允许在缓慢的消费者 运行ning 时调用我的服务器?
因为这是一个 async
函数,您应该使用 asyncio
的 sleep
。
import asyncio
from channels.generic.websocket import AsyncJsonWebsocketConsumer
class MyConsumer(AsyncJsonWebsocketConsumer):
async def connect(self):
await asyncio.sleep(99999999)
await self.accept()
如果您使用 time.sleep
,您将 sleep
整个 python 线程。
这也适用于当您发出上游 HTTP 请求时需要使用 asyncio
http 库而不是同步库。 (基本上你应该等待任何预计需要的时间)