1.池的概念
主线程: 相当于生产者,只管向线程池提交任务。
并不关心线程池是如何执行任务的。
因此,并不关心是哪一个线程执行的这个任务。
线程池: 相当于消费者,负责接收任务,
并将任务分配到一个空闲的线程中去执行
2.自定义线程池实现
import datetime
import time
from queue import Queue
from threading import Thread
class ThreadPool:
"""
__init__ 初始化队列及线程池
worker 实现消费者
apply_async 生产任务
join 队列管道阻塞,等待任务被提取完
逻辑分析: 首先在初始化后会生成多个线程, 线程任务worker执行,里面是一个死循环(while),
会不断的监测队列任务情况,有任务就会分配
任务来源apply_async进行不间断的任务添加
因为队列设置了join(),会对线程池分配任务,当队列没有任务就进行执行
task_done()回应完成。新任务进来继续分配
"""
def __init__(self, n):
self.queue = Queue()
for i in range(n):
Thread(target=self.worker, daemon=True).start()
def worker(self):
while True:
func, args, kwargs = self.queue.get()
func(*args, **kwargs)
self.queue.task_done()
def apply_async(self, func, args=(), kwargs={}):
self.queue.put((func, args, kwargs))
def join(self):
self.queue.join()
def tools(*args, **kwargs):
time.sleep(2)
print(f'任务完成:{datetime.datetime.now()}')
if __name__ == '__main__':
pool = ThreadPool(5)
for i in range(12):
pool.apply_async(tools, (1, 2, 3), {'a': 2, 'b': 3})
print('提交任务')
pool.join()
print('完成任务')
3. 内置线程池
close - 关闭提交通道,不允许再提交任务
terminate - 中止进程池,中止所有任务
import datetime
import time
from multiprocessing.pool import ThreadPool
def tools(*args, **kwargs):
time.sleep(2)
print(f'任务完成:{datetime.datetime.now()}')
if __name__ == '__main__':
pool = ThreadPool(5)
for i in range(12):
pool.apply_async(tools, (1, 2, 3), {'a': 2, 'b': 3})
print('提交任务')
pool.close()
pool.join()
print('完成任务')