2008年11月18日星期二

a foolish message driven framework

# a message driven test
# note, one msg action is a single thread
# if multi cpu is used and an object is to do multi action at the same time,
# what should be do? maybe cannot.
# modified:
# the message has the time information indicate when to action

import time

msgqueue = []

def add2mq(mq, msg):
if not msg.when: msg.when=time.time()
prioityOfx = msg.when
lo = 0
hi = len(mq)
while lo < hi:
mid = (lo+hi)/2
if prioityOfx < mq[mid].when: hi = mid
else: lo = mid+1
mq.insert(lo, msg)

class Obj:
def do(self, msg, msgqueue):pass
def sleep(self, mq, when=None):
add2mq(mq,Msg(self,self,("work",), when))

class Msg:
def __init__(self, toObj, fromObj, msg, when=None):
self.toObj = toObj
self.fromObj = fromObj
self.msg = msg
self.when = when

def case1(msgqueue):
N = 1000
M = 50
o = [None]*N
class Obj1(Obj):
def __init__(self, i):
self.xid = i
def do(self, msg, mq):
name = msg.msg[0]
if name=="reset":
self.i = 0
self.sleep(mq)
elif name=="work":
if self.i < M:
add2mq(mq,Msg(self,o[i],("show", self.i)))
self.i +=1
self.sleep(mq)
else:
print "#%d die" % self.xid
elif name=="show":
print "#%d show %s" % (self.xid, msg.msg[1])
else:
print "#%d unknow msg %s" % (self.xid, name)

for i in range(N):
o[i] = Obj1(i)
add2mq(msgqueue,Msg(o[i],None,("reset",)))

class Obj2(Obj):
def __init__(self, i):
self.xid = i
def do(self, msg, mq):
name = msg.msg[0]
if name=="reset":
self.sleep(mq, time.time())
elif name=="work":
print "click", msg.when, time.time()
self.sleep(mq, msg.when + 1)
add2mq(msgqueue,Msg(Obj2(0),None,("reset",)))

case1(msgqueue)

print "start."
t1=time.time()
while len(msgqueue)>0:
m = msgqueue[0]
msgqueue=msgqueue[1:]
if m.when==None:
m.toObj.do(m, msgqueue)
else:
delay = m.when-time.time()
if delay>0: time.sleep(delay)
m.toObj.do(m, msgqueue)
print "end."
t2=time.time()
print t2-t1

没有评论:

博客归档

neoedmund's shared items

我的简介

ZIP Code File