ipc pickle

Gerson Kurz gerson.kurz at t-online.de
Mon Feb 25 14:19:16 EST 2002


On 25 Feb 2002 10:41:53 -0800, hugomartires at hotmail.com (Hugo
Martires) wrote:

>This only receive twice.
>If i need to receive more than twice that is a problem.
>See this:
...
>I want to send a big vector it's size could be more or less than 8000.
>The client to receive the entire vector must receive several times
>since BUFFER SIZE it's not so big. (do you know it's maximum value ?)
>So the server send :

ok, you asked for it, you got it. Download

http://p-nand-q.com/python/rpcsys.zip

Its *slow* (well, compared to the ipc-test), but it works. Its
stripped down from something bigger, so it might contain a "legacy"
thing or two; it might even have a bug. Its not yet very well
documented, but here are some hints:

- your problem is that the socket blocks when its buffer is full.
Since you have a single-threaded app, the data is never read, and thus
you block forever. Because it was single-threaded, no actual IPC was
ever involved, so the time measured is not like "real" values.

- a real life IPC system consists of at least 2 procs, so, in the
archive you have test-server.py and test-client.py

- edit test-server.py's portnum to suit your needs (defaults to 8000
because many PFWs allow that). 

- class RpcServer handles connections from multiple clients and starts
a dedicated thread for each connection

- class RpcServerConnection handles a connection

- class RpcServerInterface is a simple python class that implements
the interface you want to make available by RPC. In this example: 

# this is the servers' RPC interface
class RpcServerInterface(RpcServerConnection):
    def test(self,argument):
        return len(argument)

it exposes just one function, "test", that has one argument, a list.
This is the only class you need to care about!

- start test-server.py

- edit test-client.py's portnum to suit your needs (defaults to 8000
because many PFWs allow that). 

- RpcClientThread implements a connection to a server (each client is
connected to one server only in this modell)

- this class has to implement stubs for functions exposed by the
server. For our test function, the stub reads

    def test(self,arguments):
        return self.RpcDispatch('test',(arguments,))

How about a more complicated example? Say, our RPC server exports this
function:

    def GetCashUnits(self,a,b,c):
        print "GetCashUnits() called", a,b,c
        return [1,2,3,4]

A function that gets three parameters and returns a list. The stub
would have to read

    def GetCashUnits(self,a,b,c):
        return self.RpcDispatch('GetCashUnits',(a,b,c))

You get the idea. Once you connect to the server you simply call these
functions, and get a sync return value, too.

LIMITATIONS: Return Values must be < 1024 bytes as of now, but that
would be easy to change. (My return values are much smaller).




More information about the Python-list mailing list