与twisted.internet.reactor的交互

2 投票
2 回答
555 浏览
提问于 2025-04-15 18:06

我正在学习Twisted,特别是它的XMPP部分。我正在写一个Jabber客户端,需要发送和接收消息。这里是我的代码:http://pastebin.com/m71225776。 我理解的工作流程是这样的: 1. 我为重要的网络事件创建处理器(比如连接、接收消息、断开连接等)。 2. 我运行反应器(reactor)。此时会开始一个循环,等待任何事件发生。当事件发生时,它会被传递给指定的处理器。 问题出在发送消息上。发送消息并不与任何网络事件关联,所以我无法为其创建处理器。而且在反应器的循环停止工作之前,我无法对其做任何操作。但我的目标是“在需要时发送消息,并在数据到达时接收”。 我觉得我还没有完全理解Twisted的哲学,所以请给我指条明路。

2 个回答

0

更准确地说,在反应堆(reactor)调用你的回调函数之前,你什么都做不了。不是你去调用 Twisted,而是 Twisted 来调用你。

一种实验的方法是让你知道会被调用的某个设置处理程序(或者在你启动反应堆后放一些测试代码)去调用 callLater() 或者 loopingCall()。

2

你只需要找出哪些事件会触发发送消息。

比如,在一个图形用户界面(GUI)客户端中,发送消息的时机就是用户输入内容的时候。你需要和一个图形工具包结合使用,利用Twisted的反应器来处理主循环(例如,有一个适用于Gtk+的Twisted反应器)。这样,你就可以监听一些界面事件,比如用户在文本区域按下回车键;然后你可以对这个事件做出反应,发送一条消息。

其他的事件来源可以是Twisted的定时器,任何类型的协议,包括进程间通信(IPC)、webhooks等等。

顺便提一下,如果你需要一个更高级的库来处理XMPP和Twisted,可以看看Wokkel

撰写回答