在后台使用Twisted代理TCP套接字的一般方法?

时间:2011-03-05 16:33:54

标签: python twisted

我正在寻找一些关于如何处理我认为Twisted非常适合的问题的一般信息。 (我是Twisted但不是Python的新手)

我有一个家庭自动化控制器,可以支持单个TCP套接字连接,发送和接收二进制数据。我想使用XMPP作为套接字的桥接器,这样用户就可以发送命令并接收事件。

我有一个与Twisted一起使用的基本套接字连接,它能够从O'Reilly书中的一个示例发送和接收命令。我还有一个用SleekXMPP库编写的完全可用的Python XMPP bot,我很满意。我只是不确定如何将它们组合在一起。

基本情景是:

  1. 用户向XMPP bot发送消息,该消息指出要发送到套接字的命令
  2. ASCII套接字命令转换为二进制并发送到套接字
  3. Socket接收命令并发送二进制响应
  4. 转换为ASCII的二进制响应
  5. XMPP bot将响应发送回用户。
  6. 网络套接字也可以接收网络事件(独立于用户操作),应该发送给用户
  7. 提示挑战的是#6,否则我只需要在需要写东西时按需打开/关闭套接字。

    我在使用Twisted缠绕头部时遇到的问题是让这两个事件循环进行通信的最佳方法。我已经看到很多关于使用队列,延迟,线程,选择等的信息。我有一种感觉,如果我只是学会正确使用该工具,Twisted可以处理大部分复杂性。

    如果有人可以指出我正确的方向,我会接球并与之一起跑。正如我所提到的,我对我的XMPP机器人感到满意,并且我想使用现有的代码。我认为我的问题现在归结为在后台创建套接字,然后在前台发送和接收来自该套接字的数据。

    顺便说一下,我很高兴在我的代码工作后再分享我的代码,这样其他人就可以从我要求的帮助中受益。

    - 斯科特

1 个答案:

答案 0 :(得分:1)

非阻塞IO引擎的一个问题是它几乎全有或全无。一旦引入阻止代码,就会很快失去事件驱动的异步方法的大部分好处。只要有可能(根据经验),最好让整个应用程序在同一个反应堆上运行。

我认为,你有两种选择:

  1. Twisted不是线程安全的。也就是说,您可以使用deferToThreadcallFromThread等机制与其他线程进行交互。这是迄今为止应用程序设计中最令人困惑且不必要的复杂方法。如果你是新手,那就特别痛苦。
  2. 使用twisted.words.protocols.jabber,并使用扭曲的反应堆以非阻塞方式实现您的XMPP内容。这样,它将与您所有其他扭曲的代码一起愉快地存在。并允许您在协议之间进行干净的交互。它将导致更少的代码,以及易于扩展,维护和测试的强大实现。