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程序设计有所帮助。