18.6 Distributed Computing

There are many standards for distributed computing, from simple Remote Procedure Call (RPC) ones to rich object-oriented ones such as CORBA. You can find several third-party Python modules supporting these standards on the Internet.

The Python standard library comes with support for both server and client use of a simple yet powerful standard known as XML-RPC. For in-depth coverage of XML-RPC, I recommend the book Programming Web Services with XML-RPC, by Simon St. Laurent and Joe Johnson (O'Reilly). XML-RPC uses HTTP as the underlying transport and encodes requests and replies in XML. For server-side support, see Section in Chapter 19. Client-side support is supplied by module xmlrpclib.

The xmlrcplib module supports a class ServerProxy, which you instantiate to connect to an XML-RPC server. An instance s of ServerProxy is a proxy for the server it connects to. In other words, you call arbitrary methods on s, and s packages up the method name and argument values as an XML-RPC request, sends the request to the XML-RPC server, receives the server's response, and unpackages the response as the method's result. The arguments to such method calls can be of any type supported by XML-RPC:


Constant attributes True and False of module xmlrpclib (since module xlmrpclib predates the introduction of bool into Python, it does not use Python's built-in True and False values for this purpose)

Integers, floating-point numbers, strings, arrays

Passed and returned as Python int, float, Unicode, and list values


Passed and returned as Python dict values whose keys must be strings


Passed as instances of class xmlrpclib.DateTime; value is represented in seconds since the epoch, as in module time (see Chapter 12)

Binary data

Passed as instances of class xmlrpclib.Binary; value is an arbitrary string of bytes

Module xmlrpclib supplies two factory functions.



Creates and returns an instance of Binary wrapping the given bytestring.



Creates and returns an instance of Boolean with the truth value of x.

Module xmlrpclib supplies several classes.


class Binary(x)

x is a Python string of arbitrary bytes. b represents the same bytes as an XML-RPC binary object.


class Boolean(x)

x is any Python value, and b has the same truth value as x.


class DateTime(x)

x is a number of seconds since the epoch, as used in module time, covered in Chapter 12.


class ServerProxy(url)

If the server at the given url supports introspection, s supplies an attribute s.server that in turn supplies three methods:

s.server.listMethods( )

Returns a list of strings, one per each method supported by the server.

s.server.methodSignature( name)

Returns a list of strings, each a signature of method name on the server. A signature string is composed of type names separated by commas: first the type of the return value, then the type of each argument. When method name has no defined signature, s.server.methodSignature(name) returns some object that is not a list.

s.server.methodHelp( name)

Returns a string with help about method name. The string can be either plain text or HTML. When the method name has no defined help, s.server.methodHelp(name) returns an empty string ''.

The following example uses xmlrpclib to access O'Reilly's Meerkat open wire service (see http://www.oreillynet.com/meerkat/ for more information about Meerkat) and displays the last few news items about Python.

import xmlrpclib

proxy = xmlrpclib.ServerProxy(
results = proxy.meerkat.getItems({'search':'Python', 'num_items':7})

want_keys = 'title link description'.split(  )
n = 0
for result in results:
    n = n + 1
    for key in want_keys:
        print '%d. %s: %s' % (n, key.title(  ), result.get(key))

    Part III: Python Library and Extension Modules