【问题标题】:Client/server on python-twistedpython-twisted 上的客户端/服务器
【发布时间】:2013-12-24 23:07:16
【问题描述】:

我正在尝试制作一个 Twisted 应用程序,它一方面是 XMLRPC 服务器,另一方面是特殊非对称二进制协议的客户端(我们称之为“二进制”) 现在它是这样工作的:

  1. 接收xmlrpc请求并返回请求id(我是服务器)
  2. 向“二进制”服务器发出请求(我是客户端)
  3. xmlrpc 客户端使用 (1) 中给出的请求 ID 发出轮询请求。
  4. 如果“二进制”协议已经给出轮询请求,则返回“稍后再试”或实际结果。

现在可以了,但我想放弃轮询程序。

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

你有什么建议?分离线程?还有什么?

from twisted.internet import reactor

reactor.connectTCP(globalconf.cfgBinServerAddr, globalconf.cfgBinServerPort, BinFactory(binProtocol))

reactor.listenTCP(globalconf.xmlrpcPort, server.Site(xmlrpcProtocol))
reactor.run()

【问题讨论】:

    标签: python twisted


    【解决方案1】:
    1. 接收 xmlrpc 请求。如果您需要它来向“二进制”服务器发出请求,请计算请求 ID。不要从方法返回
    2. 以相同的方法向“二进制”服务器(您是客户端)发出异步请求。暂时不要返回
    3. 放弃这一步(xmlrpc请求还没有完成,没有什么可轮询的)
    4. 返回延迟的“真实结果”。你完成了。 xmlrpc 机器准备好后将返回真实结果给 xmlrpc 客户端

    这是一个返回延迟子进程输出的示例 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
    

    【讨论】:

      猜你喜欢
      • 2013-07-30
      • 2011-04-07
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多