代码之家  ›  专栏  ›  技术社区  ›  kitensei

扭曲的deferToThread tcp连接

  •  0
  • kitensei  · 技术社区  · 10 年前

    我对twisted是个新手,试图编写我的第一个应用程序,但实际上我遇到了这个问题:

    我有一个主线程,它加载一堆要运行的模块,这些模块中的每一个都位于远程服务器上,并通过tcp连接可用,下面是模块运行代码的样子:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import socket
    import struct
    
    from twisted.internet import endpoints
    from twisted.internet.defer import inlineCallbacks
    from twisted.spread import pb
    from txapp.core import get_modules
    
    from txmod.spread import EnvelopeSpreadReceiver
    
    
    @inlineCallbacks
    def listen(reactor):
        modules = yield get_modules()
    
        for mod in modules:
            endpoint = endpoints.serverFromString(reactor, 'tcp:%d:%s' %
                                                  (int(mod.get('module_server_port') or 0),
                                                   socket.inet_ntoa(struct.pack('!L', mod.get('module_server_ipaddr'))),))
            endpoint.listen(pb.PBServerFactory(EnvelopeSpreadReceiver()))
            print 'PBServerFactory starting on %s:%d for module %s' % (
                socket.inet_ntoa(struct.pack('!L', mod.get('module_server_ipaddr'))),
                int(mod.get('module_server_port')),
                mod.get('module_name'))
    
    
    def main():
        from twisted.internet import reactor
        listen(reactor)
        reactor.run()
    
    
    if __name__ == "__main__":
        main()
    

    给定的服务器 也许 在不同的端口上运行多个模块,但通常是: 1台服务器,1个模块

    运行应用程序的主服务器将尝试连接到每个模块,运行代码并期待结果(成功与否)。

    我正在纠结如何使此代码不阻塞:如果服务器无法响应,tcp连接可能会挂起,所以我应该将每个模块tcp连接放在一个单独的线程上 deferToThread ?

    主应用程序每天将处理数百万个请求,因此它应该是完全无阻塞的。

    这是正确的处理方法吗?有人能给我指出如何实现这一目标的正确方向吗?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Glyph    10 年前

    Twisted的事件循环API不是线程安全的 Twisted's threading documentation 。这意味着你绝对不能打电话 deferToThread 处理连接;如果你尝试,它会崩溃的。

    等待的TCP连接不会导致事件循环停滞;用于向连接发送和接收数据的API已经是非阻塞的。所以我认为你在这里没有问题要解决,它已经为你解决了。