用python实现的线程池实例代码
python3标准库里自带线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。
如果你用的是python2,那可以下载一个模块,叫threadpool,这是线程池。对于进程池可以使用python自带的multiprocessing.Pool。
当然也可以自己写一个threadpool。
#coding:utf-8 importQueue importthreading importsys importtime importmath classWorkThread(threading.Thread): def__init__(self,task_queue): threading.Thread.__init__(self) self.setDaemon(True) self.task_queue=task_queue self.start() self.idle=True defrun(self): sleep_time=0.01#第1次无任务可做时休息10毫秒 multiply=0 whileTrue: try: #从队列中取一个任务 func,args,kwargs=self.task_queue.get(block=False) self.idle=False multiply=0 #执行之 func(*args,**kwargs) exceptQueue.Empty: time.sleep(sleep_time*math.pow(2,multiply)) self.idle=True multiply+=1 continue except: printsys.exc_info() raise classThreadPool: def__init__(self,thread_num=10,max_queue_len=1000): self.max_queue_len=max_queue_len self.task_queue=Queue.Queue(max_queue_len)#任务等待队列 self.threads=[] self.__create_pool(thread_num) def__create_pool(self,thread_num): foriinxrange(thread_num): thread=WorkThread(self.task_queue) self.threads.append(thread) defadd_task(self,func,*args,**kwargs): '''添加一个任务,返回任务等待队列的长度 调用该方法前最后先调用isSafe()判断一下等待的任务是不是很多,以防止提交的任务被拒绝 ''' try: self.task_queue.put((func,args,kwargs)) exceptQueue.Full: raise#队列已满时直接抛出异常,不给执行 returnself.task_queue.qsize() defisSafe(self): '''等待的任务数量离警界线还比较远 ''' returnself.task_queue.qsize()<0.9*self.max_queue_len defwait_for_complete(self): '''等待提交到线程池的所有任务都执行完毕 ''' #首先任务等待队列要变成空 whilenotself.task_queue.empty(): time.sleep(1) #其次,所以计算线程要变成idle状态 whileTrue: all_idle=True forthinself.threads: ifnotth.idle: all_idle=False break ifall_idle: break else: time.sleep(1) if__name__=='__main__': deffoo(a,b): printa+b time.sleep(0.01) thread_pool=ThreadPool(10,100) '''在Windows上测试不通过,Windows上Queue.Queue不是线程安全的''' size=0 foriinxrange(10000): try: size=thread_pool.add_task(foo,i,2*i) exceptQueue.Full: print'queuefull,queuesizeis',size time.sleep(2)
总结
以上就是本文关于用python实现的线程池实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!