Previous Section Next Section

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 19.2.2.4 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:

Boolean

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

Structures

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

Dates

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.

binary

binary(bytestring)

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

boolean

boolean(x)

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

Module xmlrpclib supplies several classes.

Binary

class Binary(x)

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

Boolean

class Boolean(x)

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

DateTime

class DateTime(x)

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

ServerProxy

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(
    'http://www.oreillynet.com/meerkat/xml-rpc/server.php')
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))
    print
    Previous Section Next Section