【问题标题】:Channels consumer blocks normal HTTP in Django?频道消费者在 Django 中阻止了正常的 HTTP?
【发布时间】:2020-02-12 13:01:07
【问题描述】:

我在本地运行开发服务器

python manage.py runserver 8000

然后我运行一个使用下面消费者的脚本

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 请求 - 并且最终陷入死锁。

这是预期的行为吗?如何在慢速消费者运行时允许调用我的服务器?

【问题讨论】:

    标签: asynchronous deadlock django-channels


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我假设纯粹使用async 使函数异步,因此非阻塞
    • 在python中await所做的是有效地让线程能够跳开并处理其他事情,然后当你等待的事情准备好时你可​​以跳回到这里。在 python 中没有它,你仍然是单线程的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-08-20
    • 2020-07-16
    • 2019-06-24
    • 2018-07-13
    相关资源
    最近更新 更多