Basically we can call xmlrpc handlers following way:
import xmlrpclib
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
print s.system.listmethods()
In tornado we can integrate it like this:
import xmlrpclib
import tornado.web
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
class MyHandler(tornado.web.RequestHandler):
def get(self):
result = s.system.listmethods()
I have following, a little bit newbie, questions:
- Will
result = s.system.listmethods()block tornado? - Are there any non-blocking xmlrpc clients around?
- How can we achieve
result = yield gen.Task(s.system.listmethods)?
1.Yes it will block tornado, since xmlrpclib uses blocking python sockets (as it is)
2.Not that I’m aware of, but I’ll provide a solution where you can keep xmlrpclib but have it async
3.My solution doesn’t use tornado gen.
Ok, so one useful library to have at mind whenever you’re doing networking and need to write async code is gevent, it’s a really good high quality library that I would recommend to everyone.
Why is it good and easy to use ?
All you have to do, to do so is monkey patch with one simple line :
from gevent import monkey; monkey.patch_all()
When using tornado you need to know two things (that you may already know) :
Ok so here’s an example illustrating what you would need with the necessary gevent integration with tornado :
So give the example a try (adapt it to your needs obviously) and you should be good to go.
No need to write any extra code, gevent does all the work of patching up python sockets so they can be used asynchronously while still writing code in a synchronous fashion (which is a real bonus).
Hope this helps 🙂