Winter Madness - Passing Python objects as Strings

Hendrik van Rooyen mail at microcorp.co.za
Fri Jun 5 10:54:47 CEST 2009


<skip at pobox.com> wrote:


> Got some use cases?

plural cases - no.

I did it for the reason already described.
to elucidate, the code looks something like this:

rec = input_q.get()  # <=== this has its origen in a socket, as a netstring.
reclist = rec.split(',')
if reclist[0] == 'A':
    do something with the outputs
    get hold of the latest inputs
    return the result by putting a message on the normal output q.
    continue
# up to here this is the code that is done in 99.9999% of cases.
# note that it has to run as fast as possible, in a very cripple processor.
if reclist[0] == "B":   # This means we have to change state, 
                                # it comes from another thread that did
                                # not exist before an event.
   new_output_q = uncan(reclist[1]) # <==  This is where it is used
   while True:
        do similar stuff until normality is re established,
        discarding the incoming "A" records,
        using new "C" records and new_output_q.
        Terminated by a "D" record.
 
It is simply a different way of saying "use this one", 
in an in band way.

In the above, it avoids a double unpacking step - once to
get to the record type, and then to get to the actual data.
It only makes sense here because I know that the stuff
that comes in is basically an unending stream of more
of the same, and it happens - I would say thousands of 
times a second, but it is more like a hundred or so, given 
the lack of speed of the processor.

So I am quite prepared to trade off the slight inefficiency
during the seldom occurring changeover for the railroad
like chugging along in the vast majority of cases.

"seldom" here is like once a day for a few minutes.

And it sure beats the hell out of passing the queue 
name as a string and mucking around with exec or eval -
That is what I did first, and I liked it even less,
as the queue passed in such a way had to be a global
for the exec to work.

It all started because I was not prepared to waste
precious cycles in an extra unpacking stage.

So I wrote the Can extension module, and
I thought it weird enough to make it public: - 
Hands up those who have ever passed a 
pointer as a string !

- Hendrik





More information about the Python-list mailing list