【问题标题】:Make asynchronous xmlrpc (client call) in Tornado在 Tornado 中制作异步 xmlrpc(客户端调用)
【发布时间】:2013-10-09 18:46:48
【问题描述】:

我需要对 Tornado 中的 Cobbler 服务器进行异步 XML-RPC(客户端调用),例如:

cobbler_connection = xmlrpclib.Server("http://my_cobbler_server")

...
profile = yield gen.Task(cobbler_connection.get_profile, profile_name)
...

现在我正在使用 xmlrpclib,它似乎不会进行异步客户端调用,因此它最终会阻止 Tornado(或者我听说)。一般来说,我是 Tornado 和异步编程的新手(但请不要给我任何指向某些说明或初学者指南的链接)。我试过谷歌搜索,但我无法清楚地了解我需要对 xmlrpclib 进行哪些更改,以便可以使这些调用异步。任何指针将不胜感激。提前致谢。

【问题讨论】:

    标签: python asynchronous tornado xml-rpc xmlrpclib


    【解决方案1】:

    检查Twisted 是否支持各种操作通常是个好主意,因为它可以使用tornado.platform.twisted 与Tornado 结合使用。对于 XML-RPC 有如下代码:http://twistedmatrix.com/documents/13.0.0/web/howto/xmlrpc.html 一个简单的例子:

    import tornado.httpserver
    import tornado.ioloop
    import tornado.web
    import tornado.platform.twisted
    
    tornado.platform.twisted.install()
    
    from twisted.web.xmlrpc import Proxy
    from twisted.internet import reactor
    
    proxy = Proxy('http://advogato.org/XMLRPC')
    
    from tornado.options import define, options
    define("port", default=8000, help="run on the given port", type=int)
    
    class IndexHandler(tornado.web.RequestHandler):
        def printValue(self, value):
            self.write(repr(value))
            self.finish()
    
        def printError(self, error):
            self.write('error: %s' % error) 
            self.finish()
    
        @tornado.web.asynchronous
        def get(self):
            proxy.callRemote('test.sumprod', 3, 5).addCallbacks(self.printValue, self.printError)
    
    if __name__ == "__main__":
        tornado.options.parse_command_line()
        app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()
    

    基准测试:

    $ ab -n 1000 -c 5 http://localhost:8000/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software:        TornadoServer/3.0.1
    Server Hostname:        localhost
    Server Port:            8000
    
    Document Path:          /
    Document Length:        7 bytes
    
    Concurrency Level:      5
    Time taken for tests:   76.529 seconds
    Complete requests:      1000
    Failed requests:        0
    Write errors:           0
    Total transferred:      201000 bytes
    HTML transferred:       7000 bytes
    Requests per second:    13.07 [#/sec] (mean)
    Time per request:       382.646 [ms] (mean)
    Time per request:       76.529 [ms] (mean, across all concurrent requests)
    Transfer rate:          2.56 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.0      0       0
    Processing:   302  382 498.9    308    5318
    Waiting:      302  382 498.9    308    5318
    Total:        302  382 498.9    308    5318
    
    Percentage of the requests served within a certain time (ms)
      50%    308
      66%    310
      75%    311
      80%    313
      90%    320
      95%    334
      98%   1310
      99%   3309
     100%   5318 (longest request)
    

    直接使用xmlrpclib进行比较:

    import tornado.httpserver
    import tornado.ioloop
    import tornado.web
    
    import xmlrpclib    
    
    server = xmlrpclib.ServerProxy('http://advogato.org/XMLRPC')
    
    from tornado.options import define, options
    define("port", default=8000, help="run on the given port", type=int)
    
    class IndexHandler(tornado.web.RequestHandler):
        def get(self):
            self.write(repr(server.test.sumprod(3, 5)))
    
    if __name__ == "__main__":
        tornado.options.parse_command_line()
        app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()
    

    基准测试:

    $  ab -n 1000 -c 5 http://localhost:8000/
    This is ApacheBench, Version 2.3 <$Revision: 655654 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking localhost (be patient)
    Completed 100 requests
    Completed 200 requests
    Completed 300 requests
    Completed 400 requests
    Completed 500 requests
    Completed 600 requests
    Completed 700 requests
    Completed 800 requests
    Completed 900 requests
    Completed 1000 requests
    Finished 1000 requests
    
    
    Server Software:        TornadoServer/3.0.1
    Server Hostname:        localhost
    Server Port:            8000
    
    Document Path:          /
    Document Length:        7 bytes
    
    Concurrency Level:      5
    Time taken for tests:   325.538 seconds
    Complete requests:      1000
    Failed requests:        0
    Write errors:           0
    Total transferred:      201000 bytes
    HTML transferred:       7000 bytes
    Requests per second:    3.07 [#/sec] (mean)
    Time per request:       1627.690 [ms] (mean)
    Time per request:       325.538 [ms] (mean, across all concurrent requests)
    Transfer rate:          0.60 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:        0    0   0.0      0       0
    Processing:   305 1625 484.5   1532    4537
    Waiting:      305 1624 484.5   1532    4537
    Total:        305 1625 484.5   1532    4537
    
    Percentage of the requests served within a certain time (ms)
      50%   1532
      66%   1535
      75%   1537
      80%   1539
      90%   1547
      95%   1984
      98%   4524
      99%   4533
     100%   4537 (longest request)
    

    更糟糕。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多