python - 在同步代码线程内具有回调的 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()
. 由于我已经在一个单独的线程中,我认为也许正确的方法是在线程的开头创建一个新循环,使用它,然后在最后关闭它。
解决方案
推荐阅读
- r - 如何从 R 中的变量中删除属性元数据?
- teradata - Teredata:在提交删除行时创建违规表 xxx;开始事务,结束事务,不返回
- angular - Observables 的异步处理
- html - 如何使按钮水平对齐
- web-crawler - 如何使用stormcrawler从网站抓取特定数据
- java - 在加工中绘制形状
- c# - 在 Visual Studio 中通过代码添加新的 Nuget 包源
- vb.net - 比较两个 Richtextboxes 中的文本并获取差异
- python - JSONDecodeError:预期值:TD Ameritrade API 中的第 2 行第 11 列(字符 11)
- c# - 不应该发生关于异步的编译器警告