自定义简单线程池、内置线程池

自定义简单线程池

python线程是可以重复利用的,如果调用的时候每次都创建一个线程,则太浪费资源了

我把多线程比作服务员,每次有客人来的时候,都分配一个专门的服务员去服务;

当客人走了之后,服务员回到空闲状态,继续等待新的客人

import threading
from queue import Queue

class MyThread(threading.Thread):
	def __init__(self,x=5):		#定于循环次数,默认服务员数量
		self.queue = Queue()
		for i in range(1,x+1):		#一次性创建个个线程,并让他们处于启用状态
			threading.Thread(target=self.run,daemon=True,name=f'服务员{i}').start()  #启用线程

	def run(self):			#客人到来怎么服务就写在这个方法里面了
		while True:
			print(f'{threading.current_thread().name}等待任务中...')		
			a = self.queue.get()						##队列等待客人到来
			print(threading.current_thread().name,a)	#等待到客人进行服务
			self.queue.task_done()						#告诉队列服务完成,回到空闲状态去接待其他客人

	def apply_async(self,func):
		self.queue.put(func)	#这个方法给队列添加任务,相当于去拉客人,拉到客人后服务员得到客户进行服务

	def join(self):
		self.queue.join()	#等待所有服务员都服务完成,才准程序结束。

if __name__ == '__main__':
	x = MyThread()
	for i in range(60):
		x.apply_async(i)
	x.join()
    
#结果部分预览
服务员1等待任务中...
服务员2等待任务中...
服务员3等待任务中...
服务员4等待任务中...
服务员5等待任务中...
服务员5 0
服务员1 1
服务员2 2
服务员2等待任务中...
服务员2 3
服务员2等待任务中...
服务员2 4
服务员2等待任务中...

哪个服务员去服务客户是用系统调用的,可以看到服务员2服务了很多客人

内置线程池

from multiprocessing.pool import ThreadPool
import time

pool = ThreadPool(2)  #实例化线程池,括号内给定线程池数量,不给系统有默认的

def task1():
	time.sleep(3)
	print('任务1完成...')


def task2():
	time.sleep(3)
	print('任务2完成...')

pool.apply_async(task1)	#给线程池添加任务
pool.apply_async(task2)	#给线程池添加任务
print('任务提交完成!')
pool.close()		#添加任务完成之后,关闭线程池,此时不允许再提交新任务

pool.join()	#d等待任务全部完成才会继续往下运行
print('任务全部完成')

#结果预览
任务提交完成!
任务1完成...
任务2完成...
任务全部完成
[Finished in 3.4s]

个人笔记,有错误你们就当没看到吧?

你可能感兴趣的:(python)