• 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))
  • 相关阅读:
    牛客练习赛64 D-宝石装箱(容斥定律,背包)
    CF-GYM-[2019 USP Try-outs] 部分题解
    [Codeforces Round #642 (Div. 3)] ABCDEF题解
    [NCD 2019] G. Ali and the Breakfast (解析几何)
    [AtCoder Beginner Contest 165] E
    [Educational Codeforces Round 86 (Rated for Div. 2)] E. Placing Rooks (组合数学,容斥定律)
    [AtCoder Beginner Contest 164] -E
    牛客算法周周练3 C -小雨坐地铁(分层最短路)
    HDU 5726 GCD (RMQ + 二分)
    Codeforces Round #362 (Div. 2) C. Lorenzo Von Matterhorn (类似LCA)
  • 原文地址:https://www.cnblogs.com/Ohero/p/4954114.html
Copyright © 2020-2023  润新知