这是一个来自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()
。因为我已经在一个单独的线程中了,所以我认为也许正确的方法是在线程的开头创建一个新的循环,使用它,然后在最后关闭它。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐