zoukankan      html  css  js  c++  java
  • Python 之简单线程池创建

    try:
    from Queue import Queue, Empty
    except:
    from queue import Queue, Empty

    import threading
    import time
    
    
    class WorkManager(object):
    
    	def __init__(self, thread_num = 2):
    		self.work_queue = Queue() # 工作队列
    		self.threads = [] # 线程池
    		self.thread_num = thread_num #线程数
    		
    	"""
    		初始化线程
    	"""
    	def start_work(self):
    		for i  in range(self.thread_num):
    			self.threads.append(Work(self.work_queue))
    
    	""" 添加任务 """
    	def add_job(self, func, *args):
    		self.work_queue.put((func, list(args)))  #任务入队,Queue内部实现了同步机制
    
    
    	"""
    		等待所有线程运行完毕
    	"""
    	def start(self):
    		self.start_work()
    		for item in self.threads:
    			if item.isAlive():
    				item.join()
    
    
    class Work(threading.Thread):
    	def __init__(self, work_queue):
    		threading.Thread.__init__(self)
    		self.work_queue = work_queue
    		self.start()
    
    	def run(self):
    		while True:
    			try:
    				do, args = self.work_queue.get(block=False)#任务异步出队,Queue内部实现了同步机制
    				do(args) #执行
    				self.work_queue.task_done() #通知系统任务完成, task_done() 以表示检索了该项目、并完成了所有的工作时,
    				#那么未完成的任务的总数就会减少。当未完成的任务的总数减少到零时,join() 就会结束阻塞状态
    
    			except:
    				break
    
    def do_job(args):
    	time.sleep(0.1)
    	print (threading.current_thread(),list(args))
    
    
    if __name__ == '__main__':
    	start = time.time()
    	work_manager = WorkManager()  # 
    
    	work_manager.add_job(do_job, 1) # 添加任务
    	work_manager.add_job(do_job, 2) # 添加任务
    	work_manager.add_job(do_job, 3) # 添加任务
    	work_manager.add_job(do_job, 4) # 添加任务
    	work_manager.add_job(do_job, 5) # 添加任务
    	work_manager.add_job(do_job, 6) # 添加任务
    	work_manager.add_job(do_job, 7) # 添加任务
    	work_manager.add_job(do_job, 8) # 添加任务
    	work_manager.add_job(do_job, 9) # 添加任务
    
    
    	work_manager.start() # 线程池工作 , 退出了2个线程
    
    	# 重新创建了2个线程
    	work_manager.add_job(do_job, 8) # 添加任务
    	work_manager.add_job(do_job, 9) # 添加任务
    	work_manager.start() # 线程退出
    
    	end = time.time()
    
    	print ("cost all time: %s" %(end-start))
  • 相关阅读:
    SpringMVC与uploadify结合进行上传
    SpringMVC使用MultipartFile文件上传,多文件上传,带参数上传
    file.delete()与file.deleteOnExit(); 的区别
    快速遍历目录下所有文件名
    使用SpringMVC框架解决中文乱码的问题
    SpringCloud微服务基础
    Linux常用命令
    Linux安装软件
    MySQL 树节点递归遍历所以子节点
    微软Office Online服务安装部署(三)
  • 原文地址:https://www.cnblogs.com/Ohero/p/4954114.html
Copyright © 2011-2022 走看看