使用Twisted/Autobahn Websockets编写"交互式"客户端

abr*_*hes 7 python twisted websocket autobahn

也许我在Twisted的异步设计中遗漏了一些东西,但我似乎无法找到一种方法来调用sendMessage()方法"externaly".我的意思是,发送消息而不仅仅是Twisted/AutobahnWebsockets的回调方法(比如onOpen或者在onMessage()上从服务器接收数据)

当然我可以启动一个线程并调用my_protocol_instance.sendMessage("hello")但这会破坏异步设计的所有目的吗?

在一个具体的例子中,我需要一个顶级包装类来打开连接并管理它,每当我需要时,我都会调用my_class.send_my_toplevel_message(msg).我该如何实现呢?

希望我对我的解释一直很清楚.

谢谢

小智 3

为什么需要一个线程来启动 protocolInstance.sendMessage() ?这可以在正常的反应器回路中完成。

Twisted 的核心是 Reactor,当你认为 Twisted 本身是反应性的时,它可以让你更容易地看待事物——这意味着它做某事是对其他事物的反应(响应)。

现在我假设您正在谈论的线程也是由于某些事件或活动或状态而在调用 sendMessage 时创建和创建的。我很难想象你只需要突然发送一条消息而没有任何理由做出反应的情况。

然而,如果有一个事件应该触发 sendMessage,则无需在线程中调用该事件:只需使用扭曲的机制来捕获该事件,然后从该特定事件的回调中调用 sendMessage 即可。

现在来看你的具体例子:你能具体说明“每当我需要时”在这个问题的上下文中到底意味着什么吗?来自另一个连接的输入?来自用户的输入?循环活动?

  • @jbreicis 是的。但细节并不重要。我只需要一种方法来保持twisted 运行而不阻塞我的主程序,同时允许我触发向其发送数据。我将发布我的解决方案并征求您的意见。 (3认同)
  • 从后台线程将事件注入主反应器线程的 Twisted 方法是通过“callFromThread”。您可以查看http://twistedmatrix.com/documents/current/core/howto/threading.html (2认同)