1

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 にどのような変更を加える必要があるかを明確に理解できません。どんなポインタでも大歓迎です。前もって感謝します。

4

1 に答える 1

2

Twistedは を使用して Tornado と組み合わせることができるため、通常、Twistedtornado.platform.twistedがさまざまな操作をサポートしているかどうかを確認することをお勧めします。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)

ずっと悪いです。

于 2013-10-10T15:37:31.100 に答える