同步代码线程中带有回调的Django渠道

时间:2019-05-04 13:40:36

标签: python python-asyncio django-channels

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

0 个答案:

没有答案