non-blocking PIPE read on Windows

Durumdara durumdara at gmail.com
Mon Jul 31 08:11:55 EDT 2006


Hi !

A new version with binary data handling. 103 seconds with 1000 data
exchange.

import os, sys, time, binascii, cPickle

bpath,bname=os.path.split(sys.argv[0])

def Log(Msg,IsMaster,First=False):
    fn=sys.argv[0]+'.'+['c','m'][int(IsMaster)]+'.log'
    mode='aw'[int(First)]
    f=open(fn,mode)
    f.write('\n%s:\n'%time.time())
    f.write('%s\n'%Msg)
    f.flush()
    f.close()

def ReadTextPacket(SourceStream):
    packet=SourceStream.read(6)
    psize=int(packet)
    packet=SourceStream.read(psize)
    return packet

def WriteTextPacket(DestStream,Packet):
    Packet=str(Packet)
    DestStream.write('%06d'%len(Packet))
    DestStream.write(Packet)
    DestStream.flush()

import base64

def PackObj(Obj):
    pckpacket=cPickle.dumps(Obj)
    enstr=base64.encodestring(pckpacket)
    return enstr

def UnpackObj(Packet):
    pckpacket=base64.decodestring(Packet)
    obj=cPickle.loads(pckpacket)
    return obj

#s=PackObj([1,None,'A']*10)
#print s
#print UnpackObj(s)
#sys.exit()

def ReadBinPacket(SourceStream):
    txtpacket=ReadTextPacket(SourceStream)
    obj=UnpackObj(txtpacket)
    return obj

def WriteBinPacket(DestStream,Obj):
    txtpacket=PackObj(Obj)
    WriteTextPacket(DestStream,txtpacket)


if 'C' in sys.argv:
    Log('Client started',0,1)
    try:
        while 1:
            #Log('Waiting for packet',0,0)
            data=ReadBinPacket(sys.stdin)
            #Log('Packet received',0,0)
            #Log('The packet is: %s'%([data]),0,0)
            #Log('Print the result',0,0)
            WriteBinPacket(sys.stdout,"Master wrote: %s"%([data]))
            if str(data).strip()=='quit':
                Log('Quit packet received',0,0)
                break
    except Exception,E:
        Log(str(E),0,0)
    Log('Client finished',0,0)
else:
    Log('Master started',1,1)
    try:
        Log('Start subprocess',1,0)
        import time
        st=time.time()
        child_stdin,child_stdout=os.popen2(r'c:\python24\python.exe %s
C'%(bname))
        for i in range(1000):
            #Log('Send packet',1,0)
            WriteBinPacket(child_stdin,['Alma'*100,i])
            #Log('Waiting for packet',1,0)
            s=ReadBinPacket(child_stdout)
            #Log('Packet is: %s'%([s]),1,0)
            #Log('Print packet',1,0)
            #print "Client's answer",[s]
            import time
            time.sleep(0.1)
        #Log('Send packet',1,0)
        WriteBinPacket(child_stdin,'quit')
        #Log('Waiting for packet',1,0)
        s=ReadBinPacket(child_stdout)
        #Log('Packet is: %s'%([s]),1,0)
        #Log('Print packet',1,0)
        #print "Client's answer",[s]
        Log('Master finished',1,0)
    except Exception,E:
        Log(str(E),1,0)
    print time.time()-st

dd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20060731/5f4d998d/attachment.html>


More information about the Python-list mailing list