Hi !

I want to comm. between 2 procs with mmap - in Windows XP.
Interesting thing I saw yesterday.

When I start my mtest.py without redirection stdout, the program
freezed. When I pushed Enter, is was released.
(Just like when I use raw_input in the end of the code... :-))

For this effect I need to start my process from "Start Menu/run" "cmd"
"mtest.py".
When I start this program from Context, PyScripter, Total Commander, I
don't see same effect.
If I redirect sys.stdout, I don't see this effect.

What is the problem ? I do wrong anything ? Or it is a bug ? Or my
notebook do this ?

(I have another example, and it is buggy too, but I tested only in my notebook.)

Thanks for help:
dd
import os, sys
from mmap import mmap
from time import sleep
from cPickle import dumps, loads

_CLIENT_PACKET='C'
_MASTER_PACKET='M'
_SIGNALS=[_CLIENT_PACKET, _MASTER_PACKET]
_PACKET_HEAD=1+12

class MappedFileMgr:

    def __init__(self,FileName,IsMaster,InitialSize=1024):
        self.FileName=FileName
        self.InitialSize=InitialSize
        self.IsMaster=IsMaster
        self.File=None
        self.MapObj=None
        self.BlockSleep=0

    def Open(self):
        IsMaster=self.IsMaster
        mode=['rb+','wb'][int(IsMaster)]
        f=self.File=open(self.FileName,mode)
        if IsMaster:
            f.write('0'*self.InitialSize)
            f.close()
            f=self.File=open(self.FileName,'rb+')
        mo=self.MapObj=mmap(f.fileno(),0)
        if IsMaster:
            mo[0]=_CLIENT_PACKET
            mo[1:13]='%012d'%0

    def Close(self):
        self.MapObj.close()
        self.File.close()
        self.MapObj=None
        self.File=None

    def WaitForYou(self):
        YourSign=_SIGNALS[int(not self.IsMaster)]
        mo=self.MapObj
        bs=self.BlockSleep
        # Wait for another side
        while 1:
            if mo[0]==YourSign:
                break
            else:
                if bs:
                    sleep(bs)

    def Send(self,Obj):
        IsMaster=self.IsMaster
        MySign=_SIGNALS[int(IsMaster)]
        mo=self.MapObj
        self.WaitForYou()
        # We can send
        # Check size
        data=dumps(Obj,1)
        dlen=len(data)
        nlen=dlen+_PACKET_HEAD
        if mo.size()<nlen:
            mo.resize(nlen)
        # Create packet, and send it
        packet='%012d%s'%(dlen,data)
        mo.seek(1)
        mo.write(packet)
        mo[0]=MySign

    def Receive(self):
        IsMaster=self.IsMaster
        MySign=_SIGNALS[int(IsMaster)]
        mo=self.MapObj
        mos=mo.size()
        if len(mo)<>mos:
            mo.resize(mos)
        self.WaitForYou()
        # We can read the packet
        # Check size
        plen=int(mo[1:13])
        if plen==0:
            Obj=None
        else:
            data=mo[13:13+plen]
            Obj=loads(data)
        mo.seek(1)
        mo[1:13]='%012d'%0
        mo[0]=MySign
        return Obj


if __name__=='__main__':
    mfn=os.path.join(os.getcwd(),'test.dat')
    m1=MappedFileMgr(mfn,1,20)
    m1.Open()
    m2=MappedFileMgr(mfn,0)
    m2.Open()
    m1.Send(range(10))
    print m2.Receive()
    print m1.Receive()
    m2.Send('AAA')
    print m1.Receive()

import sys,fmapmgr,subprocess,os,time

mfn=os.path.join(os.getcwd(),'test.dat')
logfn=sys.argv[0]+'.log'
ismaster=len(sys.argv)==1
if not ismaster:
    logfn=logfn.replace('.log','.clt.log')
sys.stdout=open(logfn,'w')
print time.time()
if ismaster:
    m1=fmapmgr.MappedFileMgr(mfn,1,20)
    m1.Open()
    subprocess.Popen([r'c:\python24\python.exe',os.path.join(os.getcwd(),'mtest.py'),'1'])
    m1.Send(range(10))
    print m1.Receive()
else:
    m2=fmapmgr.MappedFileMgr(mfn,0)
    m2.Open()
    print m2.Receive()
    m2.Send('A')
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to