AsyncJsonWebsocketConsumer在第一次完成之前不处理第二条消息

时间:2018-07-10 17:25:10

标签: django python-asyncio django-channels

转到channels2之后,我仍在努力处理python的“新”异步/等待和异步。 首先,我尝试从文档中复制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之类的“新事件使用者” ... 任何有关如何正确执行此操作的提示都值得赞赏...

1 个答案:

答案 0 :(得分:0)

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

显然是

版本3:

asyncio.ensure_future( self.replay_runit(msg) )

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