【问题标题】:AsyncJsonWebsocketConsumer not handling 2nd message before 1st finishedAsyncJsonWebsocketConsumer 在第一条消息完成之前未处理第二条消息
【发布时间】:2018-07-10 17:25:09
【问题描述】:

在迁移到 channels2 之后,我仍在为 python 的“新”async/await 和 asyncio 苦苦挣扎。 首先,我尝试从文档中重现 Worker and Background Tasks,但后来我意识到我的任务应该像简单的 async 函数一样运行。

所以,我的测试函数是

async def replay_run(self, event):
    print_info("replay_run", event, self.channel_name)
    import asyncio
    for i in range(10):
        await asyncio.sleep(1)
        print_info("replay_run-",i, event, self.channel_name)

以及async def receive_json(self, event) 中的以下两个调用 似乎可以防止立即处理后续传入的消息。

版本 1:

await self.channel_layer.send(
    self.channel_name, {
        "type": "replay_run", "sessionID": msg["sessionID"]
    })

版本 2:

    await self.replay_run(msg)

首先我想到的是版本 1,因为我认为我需要注册一个“新事件消费者”,例如 await asyncio.gather... 任何关于如何做到这一点的提示表示赞赏...

【问题讨论】:

  • 您是说您的print_info 没有按预期运行吗?或者您是否收到任何错误?另外,在第 1 条消息完成之前不处理第 2 条消息是什么意思?
  • 没有错误,但我希望两个循环的交错输出从 1 计数到 10。相反,第一个计数甚至在我看到我的第二个传入消息和 then 第二个之前完成之后从 1 数到 10

标签: django python-asyncio django-channels


【解决方案1】:

在这里找到解决方案:django.channels async consumer does not appear to execute asynchronously

显然是这样的

版本 3:

asyncio.ensure_future( self.replay_runit(msg) )

...为了在不阻塞通道的情况下安排“长时间运行的协程”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2017-04-18
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    相关资源
    最近更新 更多