Django Channels在asyncio.sleep期间无法接收事件?

我正在使用AsyncWebSocketConsumer,并且想让消费者在处理一个特定事件时睡眠10秒钟。因此,在收到该事件后,我将呼叫await asyncio.sleep(10)。但是问题在于,它会在接下来的10秒钟内阻止此消费者实例的事件。

我的问题是,如果我使用的是AsyncConsumer,即使我处于异步睡眠状态,它也不应该继续发送将来的事件吗?

我一直在浏览daphne服务器的代码,发现以下内容:

    def onmessage(self,payload,isBinary):
        # If we're muted,do nothing.
        if self.muted:
            logger.debug("Muting incoming frame on %s",self.client_addr)
            return
        logger.debug("WebSocket incoming frame on %s",self.client_addr)
        self.last_ping = time.time()
        if isBinary:
            self.application_queue.put_nowait(
                {"type": "websocket.receive","bytes": payload}
            )
        else:
            self.application_queue.put_nowait(
                {"type": "websocket.receive","text": payload.decode("utf8")}
            )

这意味着在从前端接收到新事件时,它将创建一个新任务并将其添加到异步队列中以供使用者使用。那么,为什么要睡在一个异步任务上阻止其他任务呢?我在这里想念东西吗?

iCMS 回答:Django Channels在asyncio.sleep期间无法接收事件?

通过生产者-消费者模式,每个消费者都按顺序消耗队列:从队列获取>进程>从队列获取...
在给定项目(或“事件”)的处理阶段,您正在使消费者进入睡眠状态,因此该过程直到睡眠完成才结束。您不能消费下一个商品,这就是您的消费者被封锁的原因。
您可以为该特定“事件”创建一个新的且专用的使用者,这样睡眠就不会阻止其他事件的处理。请参见asyncio.Queue,让您的struct ContentView: View { @State private var selection = 0 var body: some View { TabView(selection: $selection){ Text("First View") .font(.title) .tabItem { VStack { Image("first") Text("First") } } .tag(0) Text("Second View") .font(.title) .tabItem { VStack { Image("second") Text("Second") } } .tag(1) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } 拥有一个异步队列,并用.put_nowait()填充它,并让守护程序协程(新使用者)使用.get()来使用它,该新使用者可以AsyncWebSocketConsumer,然后再获取下一项。
请注意,该队列应该有一个经过仔细定义的await asyncio.sleep(10),因为队列的项目每10秒弹出一次,使其无限增长可能会占用大量内存。当队列已满时,maxsize引发put_nowait(),将其捕获在asyncio.QueueFull中,然后扔掉新项目或找到一种方法告诉生产者放慢速度。

ps:我不知道Django频道的工作原理,我从未使用过。 (#twisted标签不适用于此问题。)

本文链接:https://www.f2er.com/2140518.html

大家都在问