用 Python 实现的线程池

来源:互联网 发布:mac桌面隐藏硬盘 编辑:程序博客网 时间:2024/06/01 11:00
importQueue, threading, sys 
fromthreading importThread 
importtime,urllib 
   
# working thread 
classWorker(Thread): 
    worker_count=0 
    def__init__( self, workQueue, resultQueue, timeout =0,**kwds): 
        Thread.__init__(self,**kwds ) 
        self.id= Worker.worker_count 
        Worker.worker_count+=1 
        self.setDaemon(True
        self.workQueue=workQueue 
        self.resultQueue=resultQueue 
        self.timeout=timeout 
   
    defrun( self): 
        ''' the get-some-work, do-some-work main loop of worker threads ''' 
        whileTrue
            try
                callable, args, kwds =self.workQueue.get(timeout=self.timeout) 
                res=callable(*args,**kwds) 
                print"worker[%2d]: %s" % (self.id,str(res) ) 
                self.resultQueue.put( res ) 
            exceptQueue.Empty: 
                break 
            except
                print'worker[%2d]' % self.id, sys.exc_info()[:2
                   
classWorkerManager: 
    def__init__( self, num_of_workers=10, timeout =1): 
        self.workQueue=Queue.Queue() 
        self.resultQueue=Queue.Queue() 
        self.workers=[] 
        self.timeout=timeout 
        self._recruitThreads( num_of_workers ) 
   
    def_recruitThreads( self, num_of_workers ): 
        fori inrange( num_of_workers ): 
            worker=Worker( self.workQueue,self.resultQueue,self.timeout ) 
            self.workers.append(worker) 
   
    defstart(self): 
        forw inself.workers: 
            w.start() 
   
    defwait_for_complete( self): 
        # ...then, wait for each of them to terminate: 
        whilelen(self.workers): 
            worker=self.workers.pop() 
            worker.join( ) 
            ifworker.isAlive() andnot self.workQueue.empty(): 
                self.workers.append( worker ) 
        print"All jobs are are completed." 
   
    defadd_job( self,callable,*args,**kwds ): 
        self.workQueue.put( (callable, args, kwds) ) 
   
    defget_result( self,*args,**kwds ): 
        returnself.resultQueue.get(*args,**kwds )

[Python]代码片段

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
deftest_job(id, sleep =0.001 ): 
    try
        urllib.urlopen('https://www.gmail.com/').read() 
    except
        print'[%4d]' % id, sys.exc_info()[:2
    return id 
   
deftest(): 
    importsocket 
    socket.setdefaulttimeout(10
    print'start testing' 
    wm=WorkerManager(10
    fori inrange(500): 
        wm.add_job( test_job, i, i*0.001
    wm.start() 
    wm.wait_for_complete()
原创粉丝点击