 <p>It's usually a good idea to check if <a href="http://twistedmatrix.com/trac/" rel="nofollow">Twisted</a> has support for various operations, since it can be combined with Tornado using <code>tornado.platform.twisted</code>. For XML-RPC there is following code: <a href="http://twistedmatrix.com/documents/13.0.0/web/howto/xmlrpc.html" rel="nofollow">http://twistedmatrix.com/documents/13.0.0/web/howto/xmlrpc.html</a> A simple example:</p> <pre><code>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() </code></pre> <p>Benchmarking:</p> <pre><code>$ ab -n 1000 -c 5 http://localhost:8000/ This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt; 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) </code></pre> <p>Straight use of <code>xmlrpclib</code> for comparison:</p> <pre><code>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() </code></pre> <p>Benchmarking:</p> <pre><code>$ ab -n 1000 -c 5 http://localhost:8000/ This is ApacheBench, Version 2.3 &lt;$Revision: 655654 $&gt; 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) </code></pre> <p>Much worse.</p>