Python实现线程池代码分享
原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码
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