Tornado RPC Library on Google Code

October 18th, 2009

I finished my JSON-RPC and XML-RPC handlers for Tornado, and so I’ve thrown them up on Google Code. Now people can test my JSON-RPC v2.0 implementation on my jsonrpclib library. :) Which is just what everyone was dying to do, I’m sure.

Usage is pretty simple, it’s designed to be a.) pretty transparent and b.) easily ported between XML-RPC and JSON-RPC to compare speed, network transfer, etc. times. For example, here’s the complete code for XML-RPC client (after installing Tornado and the TornadoRPC library):

from tornadorpc.xml import XMLRPCHandler
from tornadorpc import private, start_server

class Handler(XMLRPCHandler):
    def add(self, x, y):
        return x+y
    def ping(self, obj):
        return obj
    @private
    def private(self):
        #should not get called
        return False

start_server(Handler, port=8080)

To use JSON-RPC, you’d just change any instance of xml/XML to json/JSON. There are several benefits to using JSON, such as smaller transfer size, keyword arguments, notifications, etc., but to use it you are required to install my jsonrpclib implementation.

Added my JSON-RPC library to Google Code

October 18th, 2009

Recently, I’ve been hacking together a JSON-RPC implementation for Python. It follows the xmlrpclib syntax (because it’s pretty darn simple to use and extend), but also adds some of the new, slick features of the JSON-RPC v2 (proposed) specification like:

  • Batch submissions
  • Keyword arguments
  • Notifications (both via batch and single)

So, unsurprisingly, I called it jsonrpclib. I didn’t see anything called that yet, so I hope I’m not hopping on someone else’s name. But Google Code didn’t have it, and if it’s not on Google, then it doesn’t really exist, right? :)

Project Page for jsonrpclib – http://code.google.com/p/jsonrpclib/

In some simple (read: probably inaccurate) speed tests, my library usually came out on top, about 1.1x faster than the “official” JSON-RPC implementation, and about 1.5-1.7x faster than the xmlrpclib library. I’ve also created a JSON-RPC handler for Tornado (what I used to test it), and I’ll be uploading it plus the XML-RPC Tornado handler to Google Code in the next few days, after I put some shiny paper on it. I didn’t see any other 2.0 server implementations yet (maybe because it’s just a proposed specification :) ) so I figure maybe it will be worthwhile until I can add a standalone JSON-RPC server to the library a la SimpleXMLRPCServer.

Anyway, so usage should be really familiar (this is in a python console):

>>> import jsonrpclib
>>> server = jsonrpclib.Server('http://localhost:8181')
>>> server.add(5, 6)
11
>>> server._notify.add(5, 6)
>>> batch = jsonrpclib.MultiCall(server)
>>> batch.add(10, 17)
>>> batch.ping({'key':'value'})
>>> batch._notify.add(50, 40)
>>> batch()
[27, {'key': 'value'}]

I do have to say inserting a notification into a batch seems a little silly to me since you have to do intelligent parsing afterwards to dismiss the missing notification, but people smarter than I are working on the spec, so I’ll dig for now.

If you play with it, please post in the comments about your experience! Also, add an Issue to the project page if it a.) acts oddly b.) just doesn’t work for you c.) replaces your hard drive with a toaster oven.

It’s a Twister – Now with More XML

October 15th, 2009

Holy community code, Batman. Facebook has been launching open source projects like crazy in the past few months. (This would be a Good Thing — I think they launched two today just while I refreshed the page!) Things like Cassandra, Thrift, and Hive are great additions to the community, and hopefully the rewards will go both ways. One of the projects I’ve been playing with is Tornado, FriendFeed’s Python web framework. It’s quite simple to dive into if you are familiar with any of the dozens of web frameworks available for Python (like web.py, Pylons, CherryPy, etc.), and it’s very fast. (But, in the immortal words of LeVar Burton, “don’t take my word for it.“)

Read the rest of this entry »