两个异步对象交互

Posted

技术标签:

【中文标题】两个异步对象交互【英文标题】:Two async objects interacting 【发布时间】:2021-06-02 06:45:09 【问题描述】:

我一直在探索异步在 Python 中是如何工作的。到目前为止,我已经制作了一些简单的基于 MQTT 的异步迷你服务(获取消息、执行某些操作、可能检索某些内容、发送消息)。

对于我的下一个迷你项目,我正在尝试将 Discord 和 MQTT 结合在一起。目标是让不和谐消息出现在 MQTT 上,而 mqtt 消息出现在不和谐上。我有一个异步discord-client 对象和一个异步mqtt-client 对象。两者都可以正常工作,但连接它们有点问题。

我目前的方法是让 Discord 对象成为“领先”对象,而我将 MQTT 对象放在 Discord 对象中(discord-client.mqtt-client = mqtt-client,这意味着我可以做await self.mqtt-client.publish() 之类的事情。到目前为止,这似乎可行。

我的问题是这种方法感觉有点不对劲。这是正常的做法吗?还有其他方法吗?

【问题讨论】:

连接两个客户的目标是什么?最终目标是什么?提出具体问题会让其他人更容易提供帮助。 忘了说,抱歉。目标是将消息从 discord 推送到 mqtt,反之亦然。 这听起来对asyncio.Queue 很有用。 这个问题在这一点上似乎无法回答。一方面,它要求基于非常少的细节进行某种设计审查(这本身超出了 *** 的范围)。也不清楚当前的解决方案是否由于技术问题“感觉错误”,例如可能无法处理的角落案例,或者由于设计气味一切正常,但你觉得比如不同的设计可能会提高代码的清晰度/可维护性。 @dirn:我好像完全错过了asyncio.Queue,谢谢指出!它确实使代码和图表的设计更加清晰;我现在有两个单独的对象,而不是两个对象,一个包含另一个对象,两个对象都有两个 Queue 对象。 @user4815162342:设计气味在这里是更好的术语。当有什么东西闻起来不对劲时,它可能是,但我无法确定它到底是什么,或者如何从这里开始。 【参考方案1】:

在帮助下回答我自己的问题。

嵌套异步对象可以工作,但“味道不对”。它还会导致代码看起来很奇怪(因此难以维护),并且可能会在以后引入奇怪的错误等。

更好的方法是使用asyncio.Queue,其中两个客户端对象中的每一个都有一个要写入的队列和一个要读取的队列。像这样:

discord-client -> discord-to-mqtt-queue -> mqtt-client

mqtt-client -> mqtt-to-discord-queue -> discord-client

(不是对象的实际命名)

这是可行的,有意义的,并且生成的代码是可读的。

【讨论】:

以上是关于两个异步对象交互的主要内容,如果未能解决你的问题,请参考以下文章

java中同步和异步有啥异同?

325 AJAX介绍,XMLHttpRequest对象,实现Ajax的异步交互步骤,服务器端通信状态

Vue 前后端交互

Vue 前后端交互

010 异步I/O处理 002

react-交互-异步uis