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=""> #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
-- http://mail.python.org/mailman/listinfo/python-list