0
点赞
收藏
分享

微信扫一扫

Python常用模块 之threading和Thread模块 第三阶段 线程池


目录:

  • ​​每篇前言:​​
  • ​​1. 线程池​​
  • ​​1.1 池的概念:​​
  • ​​1.2 自定义线程池:​​
  • ​​1.3 使用Python内置线程池:​​
  • ​​1.4 池的其他操作:​​

每篇前言:

🏆🏆作者介绍:【孤寒者】—全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、原力计划作者

  • 🔥🔥本文已收录于Python全栈系列专栏:​​《Python全栈基础教程》​​
  • 🔥🔥热门专栏推荐:​​《Django框架从入门到实战》、​​​​《爬虫从入门到精通系列教程》、​​​​《爬虫高级》、​​​​《前端系列教程》、​​​​《tornado一条龙+一个完整版项目》。​​
  • 📝​📝本专栏面向广大程序猿,为的是大家都做到Python从入门到精通,同时穿插有很多很多习题,巩固学习。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

1. 线程池

1.1 池的概念:

Python常用模块 之threading和Thread模块 第三阶段 线程池_Thread模块

  • 主线程:
    相当于生产者,只管向线程池提交任务。
    并不关心线程池是如何执行任务的。
  • 线程池:
    相当于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务。

1.2 自定义线程池:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
from threading import Thread
from queue import Queue
import time


class ThreadPool:
# 初始化
def __init__(self, n):
self.queue = Queue()
for i in range(n):
# 创建线程
Thread(target=self.worker, daemon=True).start() #daemon是开启守护线程

# 执行任务
def worker(self):
while True:
func, args, kwargs = self.queue.get()
func(*args, *kwargs)
self.queue.task_done()

# 获取任务,将任务添加到队列中
def apply_async(self, target, args=(), kwargs={}):
self.queue.put((target, args, kwargs))

# 阻塞
def join(self):
self.queue.join()


def fun(x):
print('爱孤寒者 第%s次' % x)
time.sleep(3)
print('帅哥美女就关注同名微信公众号【孤寒者】啦~')

# 开两个线程
t = ThreadPool(2)
# 提交10个任务
for i in range(10):
t.apply_async(fun, args=(i,))
t.join()

Python常用模块 之threading和Thread模块 第三阶段 线程池_Thread模块_02

1.3 使用Python内置线程池:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
from multiprocessing.pool import ThreadPool
import time

pool = ThreadPool(2) # 创建两个线程


def funa(x, y):
print('%s好好学习' % x)
time.sleep(3)
print('天天向上')


def funb(x, y):
print('%shello' % x)
time.sleep(3)
print('world')

# 我们这就是有一个线程池,里面有两个等待处理任务的线程,然后这两个函数就是两个任务,
# 线程池里一个线程处理一个,所以会同时输出!如果多于两个任务就会执行等待sleep

pool.apply_async(funa, args=('我们要————', 2)) # 将任务添加到线程池
pool.apply_async(funb, args=('大家要————', 4))

pool.close() # close之后则无法向线程池提交任务

# 内置线程池,自带守护线程,主线程结束,子线程也跟着结束
# 所以需要加阻塞,否则主线程一结束,子线程也跟着结束,无输出
pool.join() # 在join之前可使用终止线程,直接终止线程pool: pool.terminate()

print('这是程序的最后一行,执行到这里,主线程结束')

Python常用模块 之threading和Thread模块 第三阶段 线程池_Thread模块_03

1.4 池的其他操作:

操作一: close - 关闭提交通道,不允许再提交任务;

操作二: terminate - 中止进程池,中止所有任务 。


举报

相关推荐

0 条评论