频道消费者在 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 函数,您应该使用 asynciosleep

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 库而不是同步库。 (基本上你应该等待任何预计需要的时间)