Django通道,在同步代码线程内具有回调

2024-04-25 19:12:23 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个来自Django通道的异步函数,我想我了解如何在使用者中扩展异步功能:

async def status_msg_callback(self, status_dict):
    await self.channel_layer.group_send(
        self.group_name,
        {
            'type': 'status_msg',
            'message': {'type': 'status_dict_msg', 'status_dict' : status_dict}
        }
    )

我想把这个异步代码传递给其他线程中运行的同步代码。我尝试了一些不起作用的东西,最终我能够使用asgiref函数sync_to_async使它起作用。然而,这样做也引入了对我的channels项目的依赖,否则同步代码中就不会存在这种依赖。你知道吗

我现在尝试在调用channels回调时使用asyncio.run(),似乎效果不错。然而,我现在怀疑这是否是正确的方法,我是否忽略了一些东西。我刚刚意识到我在while循环中调用asyncio.run(),这似乎是错误的:

while not stop_signal:
    while True:
        try:
            queue_msg = status_queue.get(timeout=1)
            status_dict = queue_msg
            asyncio.run(callback(status_dict))

            print('callback with queue_msg')
        except queue.Empty:
            queue_msg = None
            break

    time.sleep(1)
    if stop_signal:
        print('stop signal received')

上面的代码使用一个队列与另一个进程通信。你知道吗

问题我使用asyncio.run()是合适的还是有其他方法来实现这一点?callback是上面第一个代码块中的代码。你知道吗

通过查看文档(https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.get_event_loop),我发现了一些手动创建和管理事件循环的方法,而不是使用run()。因为我已经在一个单独的线程中了,所以我认为也许正确的方法是在线程的开头创建一个新的循环,使用它,然后在最后关闭它。你知道吗


Tags: 方法函数run代码selfasyncioasyncsignal