首页 > 解决方案 > 在同步代码线程内具有回调的 Django 通道

问题描述

这是来自 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。但是,这样做也引入了对我的频道项目的依赖,否则同步代码中将不存在这种依赖。

我现在尝试asyncio.run()在调用通道回调时使用它,它似乎工作正常。但是,我现在质疑这是否是正确的方法以及我是否忽略了某些东西。我刚刚意识到我asyncio.run()在一个while循环中调用,这似乎是错误的:

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(). 由于我已经在一个单独的线程中,我认为也许正确的方法是在线程的开头创建一个新循环,使用它,然后在最后关闭它。

标签: pythonpython-asynciodjango-channels

解决方案


推荐阅读