python实现线程池的方法
本文实例讲述了python实现线程池的方法。分享给大家供大家参考。具体如下:
原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码
文件名:thrd_pool.py系统环境:ubuntulinux&python2.6
importthreading importtime importsignal importos classtask_info(object): def__init__(self): self.func=None self.parm0=None self.parm1=None self.parm2=None classtask_list(object): def__init__(self): self.tl=[] self.mutex=threading.Lock() self.sem=threading.Semaphore(0) defappend(self,ti): self.mutex.acquire() self.tl.append(ti) self.mutex.release() self.sem.release() deffetch(self): self.sem.acquire() self.mutex.acquire() ti=self.tl.pop(0) self.mutex.release() returnti classthrd(threading.Thread): def__init__(self,tl): threading.Thread.__init__(self) self.tl=tl defrun(self): whileTrue: tsk=self.tl.fetch() tsk.func(tsk.parm0,tsk.parm1,tsk.parm2) classthrd_pool(object): def__init__(self,thd_count,tl): self.thds=[] foriinrange(thd_count): self.thds.append(thrd(tl)) defrun(self): forthdinself.thds: thd.start() deffunc(parm0=None,parm1=None,parm2=None): print'count:%s,thrd_name:%s'%(str(parm0),threading.currentThread().getName()) defcleanup(signo,stkframe): print('Oops!Gotsignal%s',signo) os._exit(0) if__name__=='__main__': signal.signal(signal.SIGINT,cleanup) signal.signal(signal.SIGQUIT,cleanup) signal.signal(signal.SIGTERM,cleanup) tl=task_list() tp=thrd_pool(6,tl) tp.run() count=0 whileTrue: ti=task_info() ti.parm0=count ti.func=func tl.append(ti) count+=1 time.sleep(2) pass
执行方式:pythonthrd_pool.py
执行结果:
count:0,thrd_name:Thread-1 count:1,thrd_name:Thread-2 count:2,thrd_name:Thread-3 count:3,thrd_name:Thread-4 count:4,thrd_name:Thread-5 count:5,thrd_name:Thread-1 count:6,thrd_name:Thread-6 count:7,thrd_name:Thread-2 count:8,thrd_name:Thread-3 count:9,thrd_name:Thread-4 count:10,thrd_name:Thread-5 count:11,thrd_name:Thread-1 count:12,thrd_name:Thread-6 count:13,thrd_name:Thread-2 count:14,thrd_name:Thread-3 ('Oops!Gotsignal%s',15)
希望本文所述对大家的Python程序设计有所帮助。