any_srv (async server for whatever you want --default metakit)

john pyguy30 at yahoo.com
Fri Oct 24 23:22:04 EDT 2003


Any_srv is a simple rpc library that is based off of async_chat. It
grew out of the desire to make metakit available to other processes
without have to manually expose all of it and to keep in sync with
future library changes.

To do this the client is 100% stupid. It has no knowledge about the
library and the server knows nothing except for importing it. This
means it could just as easily "serve" the string library as well as a
metakit database.

How it is managed is by using __getattr__ to capture requests in the
client process and remote them to the server. Anything that is
pickelable is sent back to the client. Otherwise effectively a
reference is sent back that the client can refer to. Iteratorable
libraries are also supported. So if you make a database request (like
in metakit), you can iterate through it's rows and get the data back
in chunks.

Start the server with:
python any_srv.py

Here is example client code:
String library exposed:

    mclient=any_srv.Client()
    print mclient.split('fred barney wilma')
    ['fred', 'barney', 'wilma']
    print mclient.join(['betty','bambam','dino'])
    betty bambam dino

And just as easily Metakit exposed:

    mclient=any_server.Client()
    #Create a database:
    db = mclient.storage("datafile.mk",1)
 
    print 'Create a view'
    vw = db.getas("people[first:S,last:S,bowling:I]")
 
    print 'Add a couple of rows'
    vw.append(first='Fred',last='Flint',bowl=250)
    vw.append(first='Barney',last='Rubble',bowl=150)
 
    print 'Commit the changes to file:'
    db.commit()
 
    print 'Show a list of all people:'
    for r in vw: print r.first(), r.last(),r.bowl()   
          
    mclient.any_server_clean()

2 things to think about:

1)Need to explicity kill (perhaps with a try: finally: block) the
object references. You can do that with: mclient.any_server_clean()

2)Currently, attributes as well as methods end in (), since everything
is remoted to the server.

The code is at version .01 a bit rough and needs to have more
features/documentation (like specifying a port and library to expose
at runtime)
but it seems to work well.

It is at:

http://savannah.nongnu.org/download/pytunnel/any_srv.py
http://savannah.nongnu.org/download/pytunnel/meta_client.py

john




More information about the Python-list mailing list