17.线程池

这篇博客介绍了线程池的概念,主线程如何作为生产者提交任务,而线程池作为消费者负责任务的执行。通过自定义线程池的Python实现,展示了如何创建线程池并分配任务,以及任务的执行流程。同时,还提到了内置线程池的使用,包括`close`和`terminate`方法来控制任务提交。示例中创建了5个线程,处理12个任务,每个任务执行2秒。
摘要由CSDN通过智能技术生成

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):  # 创建线程池:线程数量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()  # 阻塞分配执行
    
    # pool.terminate()
    print('完成任务')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值