Hi,

I am trying to build a traffic network simulator using
python, for my degree project.

I need to run at least 5-6000 cars simultaneously.I
wanted to run each car in a separate thread.
However , after about 400 threads i am unable to
create new threads.

Here's the code:
>>> cars=range(1000)
>>> for i in cars:
        cars[i]=cars[i]=car(1,10,2,1,adjls,juncls)

        
>>> for i in cars:
        i.start()

Traceback (most recent call last):
  File "<pyshell#24>", line 2, in -toplevel-
    i.start()
error: can't start new thread

Is there a way out.Also, are there any tips on
performance issues?

Here is the class car:

class car(threading.Thread):
    def
__init__(self,carid,speed,dest,orig,adjls,juncls):
        threading.Thread.__init__(self)
        self.speed=speed
        self.finished=0
        self.carid=carid
        self.dest=dest
        self.orig=orig
        self.adjls=adjls
        self.juncls=juncls
       
self.shortest=find_shortest_path(adjls,self.dest,self.orig)
        self.calc=findpaths(adjls,self.dest,self.orig)
       
self.stats={'currtrsp':0,'avgspeed':0,'distcov':0,'totaltime':0}
    def traverse_track(self,p1,p2):
        counter=0
        time=0
        while self.adjls[p1][counter].to!=p2:
            counter=counter+1
        self.track=self.adjls[p1][counter]
        self.pos=0
        if self.speed>self.track.speed:
            speed=self.track.speed
        else:
            speed=self.speed
        while self.pos!=self.track.length:
            if self.track.state.has_key(self.pos):
                self.track.state[self.pos].acquire()
            else:
               
self.track.state[self.pos]=threading.Semaphore(value=self.track.lanes)
                self.track.state[self.pos].acquire()
            if self.pos!=0:
                self.track.state[self.pos-1].release()
            self.pos=self.pos+1
            sleep(1.0/speed)
            time=time+1.0/speed
       
self.stats['currtrsp']=float(self.track.length)/time
        if self.stats['avgspeed']:
           
self.stats['avgspeed']=float(self.stats['distcov']+self.track.length)/(self.stats['distcov']/self.stats['avgspeed']+self.track.length/self.stats['currtrsp'])
        else:
           
self.stats['avgspeed']=self.stats['currtrsp']
       
self.stats['totaltime']=self.stats['totaltime']+time
        if self.track.stats['avgspeed']:
           
self.track.stats['avgspeed']=(self.track.stats['avgspeed']*self.track.stats['traffictotal']+self.stats['currtrsp'])/(self.track.stats['traffictotal']+1)
        else:
           
self.track.stats['avgspeed']=self.stats['currtrsp']
       
self.stats['distcov']=self.stats['distcov']+self.track.length
       
self.track.stats['traffictotal']=self.track.stats['traffictotal']+1
    def cross_junction(self,juncls,juncid,orig,dest):
        marker=str(orig)+'-'+str(dest)
        if juncls[juncid].free.has_key(marker):
            self.track.state[self.pos].release()
        else:
            while not
juncls[juncid].signalled['green'].has_key(marker):
                sleep(0.2)
            self.track.state[self.pos-1].release()
    def run(self):
        path=self.shortest
        counter=1
        for i in path[:1]:
            self.traverse_track(i,path[counter])
            if not counter==len(path)-1:
               
self.cross_junction(self.juncls,path[counter],i,path[counter+1])
            counter=counter+1
        self.finished=1
        self.track.state[self.pos-1].release()



__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to