Dear all,
I've modified the actor example in "Introduction to Concurrent
Programming with Stackless Python" to do a small performance test, by
simply changing the displayer and made it do nothing.
As I run the system with 1000 robots, the update rate (as printed during
the program running) is about 46 on my laptop (2.0GHz*2, 1.5 GB Ram,
windows xp)
My question is, is it normal to have such a not very high update rate?
because the running program is merely having 1000 robots doing simple
movement (I also ignore the collision test), this is far too small
amount of message-exchanges compared to the situation of a real massive
multiplayer online game, isn't it?
Or did I do something wrong by modifying the codes (even if I only
deleted the displaying parts)?
Or does this example itself lack of optimization, and doesn't reveal all
the power of stackless...?
best,
Cui
======================================
import stackless
import math
import time
class actor:
def __init__(self):
self.channel = stackless.channel()
self.processMessageMethod = self.defaultMessageAction
stackless.tasklet(self.processMessage)()
def processMessage(self):
while 1:
self.processMessageMethod(self.channel.receive())
def defaultMessageAction(self,args):
print args
class world(actor):
def __init__(self):
actor.__init__(self)
self.registeredActors = {}
stackless.tasklet(self.sendStateToActors)()
def testForCollision(self,x,y):
return 0
def sendStateToActors(self):
while 1:
for actor in self.registeredActors.keys():
actorInfo = self.registeredActors[actor]
if self.registeredActors[actor][1] != (-1,-1):
VectorX,VectorY =
(math.sin(math.radians(actorInfo[2])) * actorInfo[3],
math.cos(math.radians(actorInfo[2])) * actorInfo[3])
x,y = actorInfo[1]
x += VectorX
y -= VectorY
if self.testForCollision(x,y):
actor.send((self.channel,"COLLISION"))
else:
self.registeredActors[actor] = tuple([actorInfo[0],
(x,y),
actorInfo[2],
actorInfo[3]])
worldState = [self.channel, "WORLD_STATE"]
for actor in self.registeredActors.keys():
if self.registeredActors[actor][1] != (-1,-1):
worldState.append( (actor,
self.registeredActors[actor]))
message = tuple(worldState)
for actor in self.registeredActors.keys():
actor.send(message)
stackless.schedule()
def defaultMessageAction(self,args):
sentFrom, msg, msgArgs = args[0],args[1],args[2:]
if msg == "JOIN":
print 'ADDING ' , msgArgs
self.registeredActors[sentFrom] = msgArgs
elif msg == "UPDATE_VECTOR":
self.registeredActors[sentFrom] =
tuple([self.registeredActors[sentFrom][0],
self.registeredActors[sentFrom][1],
msgArgs[0],msgArgs[1]])
else:
print '!!!! WORLD GOT UNKNOWN MESSAGE ' , args
World = world().channel
class display(actor):
def __init__(self,world=World):
self.updateTime = 0
self.oldTime = time.time();
actor.__init__(self)
self.world = World
self.icons = {}
joinMsg = (self.channel,"JOIN",self.__class__.__name__, (-1,-1))
self.world.send(joinMsg)
def defaultMessageAction(self,args):
sentFrom, msg, msgArgs = args[0],args[1],args[2:]
currentTime = time.time()
self.updateTime+=1
if currentTime - self.oldTime>1:
self.oldTime = currentTime;
print '---->', self.updateTime
self.updateTime = 0
if msg == "WORLD_STATE":
self.updateDisplay(msgArgs)
else:
print "UNKNOWN MESSAGE", args
def updateDisplay(self,actors):
return
display()
class basicRobot(actor):
def __init__(self,location=(0,0),angle=135,velocity=1,world=World):
actor.__init__(self)
self.location = location
self.angle = angle
self.velocity = velocity
self.world = world
joinMsg =(self.channel,"JOIN",self.__class__.__name__,
self.location,self.angle,self.velocity)
self.world.send(joinMsg)
def defaultMessageAction(self,args):
sentFrom, msg, msgArgs = args[0],args[1],args[2:]
if msg == "WORLD_STATE":
self.location = (self.location[0] + 1, self.location[1] + 1)
self.angle += 1
if self.angle >= 360:
self.angle -= 360
updateMsg = (self.channel, "UPDATE_VECTOR",
self.angle,self.velocity)
self.world.send(updateMsg)
elif msg == "COLLISION":
self.angle += 73
if self.angle >= 360:
self.angle -= 360
else:
print "UNKNOWN MESSAGE", args
for i in range(1000):
basicRobot(angle=135,velocity=5)
stackless.run()
_______________________________________________
Stackless mailing list
[email protected]
http://www.stackless.com/mailman/listinfo/stackless