python-twisted上的客户端/服务器

时间:2013-12-07 16:15:11

标签: python twisted

我试图创建一个Twisted应用程序,一方面是XMLRPC服务器,另一方面是特殊非对称二进制协议的客户端(让我们称之为“二进制”) 现在它的工作原理如下:

  1. 接收xmlrpc请求并返回请求ID(我是服务器)
  2. 向“二进制”服务器(我是客户端)发出请求
  3. xmlrpc客户端使用(1)中给出的请求ID进行轮询请求。
  4. 轮询请求返回“稍后再试”或实际结果,如果它已由“二进制”协议给出。
  5. 现在可行,但我想放弃投票程序。

    但是当我在xmlrpc请求处理程序中时,“二进制”协议交换不执行,所以我从来没有从“二进制”服务器获得结果。

    你能提出什么建议?单独的线程?还有别的吗?

    from twisted.internet import reactor
    
    reactor.connectTCP(globalconf.cfgBinServerAddr, globalconf.cfgBinServerPort, BinFactory(binProtocol))
    
    reactor.listenTCP(globalconf.xmlrpcPort, server.Site(xmlrpcProtocol))
    reactor.run()
    

1 个答案:

答案 0 :(得分:0)

  1. 接收xmlrpc请求。如果需要它来向“二进制”服务器发出请求,请计算请求ID。不要从方法返回
  2. 以相同的方法向“二进制”服务器(您是客户端)发出异步请求。不要回来了
  3. 删除此步骤(xmlrpc请求尚未完成,无需轮询)
  4. 返回延期的“实际结果”。你完成了。 xmlrpc机器在准备好xmlrpc客户端时将返回实际结果
  5. 这是一个示例xmlrpc服务器,它返回一个延迟的子进程输出:

    #!/usr/bin/env python
    from timeit import default_timer as timer
    from twisted.internet import reactor, utils
    from twisted.web import xmlrpc, server
    
    class Example(xmlrpc.XMLRPC):
        def xmlrpc_echo(self, x):
            """Sanity check."""
            return x
        def xmlrpc_getoutput(self):
            shell_command = "echo before sleep; sleep 10; echo after sleep"
            start = timer()
            d = utils.getProcessOutput("/bin/sh", ["-c", shell_command])
            print("Deferred created in %.2f seconds" % (timer() - start,)) # instant
            return d
    
    reactor.listenTCP(9657, server.Site(Example()))
    reactor.run()
    

    以及相应的xmlrpc客户端:

    #!/usr/bin/env python
    from timeit import default_timer as timer
    import xmlrpclib
    
    s = xmlrpclib.Server('http://localhost:9657/')
    
    def report_delay(func, *args):
        start = timer()
        print("Result %r took us %.2f seconds" % (func(*args), timer() - start))
    
    report_delay(s.echo, "Mor-ee-air-teeeee") # should be instant
    report_delay(s.getoutput) # should be ~10 seconds