python实现线程池详解编程语言

python实现线程池

原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码

import threading 
import time 
import signal 
import os 
  
class task_info(object): 
    def __init__(self): 
        self.func = None 
        self.parm0 = None 
        self.parm1 = None 
        self.parm2 = None 
      
class task_list(object): 
    def __init__(self): 
        self.tl = [] 
        self.mutex = threading.Lock() 
        self.sem = threading.Semaphore(0) 
      
    def append(self, ti): 
        self.mutex.acquire() 
        self.tl.append(ti) 
        self.mutex.release() 
        self.sem.release() 
      
    def fetch(self): 
        self.sem.acquire() 
        self.mutex.acquire() 
        ti = self.tl.pop(0)        
        self.mutex.release() 
        return ti 
      
class thrd(threading.Thread): 
    def __init__(self, tl): 
        threading.Thread.__init__(self) 
        self.tl = tl 
      
    def run(self): 
        while True: 
            tsk = self.tl.fetch() 
            tsk.func(tsk.parm0, tsk.parm1, tsk.parm2)    
  
class thrd_pool(object): 
    def __init__(self, thd_count, tl): 
        self.thds = [] 
          
        for i in range(thd_count): 
            self.thds.append(thrd(tl)) 
      
    def run(self): 
        for thd in self.thds: 
            thd.start() 
              
              
def func(parm0=None, parm1=None, parm2=None): 
    print 'count:%s, thrd_name:%s'%(str(parm0), threading.currentThread().getName()) 
      
def cleanup(signo, stkframe): 
    print ('Oops! Got signal %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 
    while True: 
          
        ti = task_info() 
        ti.parm0 = count 
        ti.func = func 
        tl.append(ti) 
        count += 1 
          
        time.sleep(2) 
    pass 
 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/8191.html

(0)
上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐

发表回复

登录后才能评论