Python 常用模块threading和Thread模块之线程池

 更新时间:2022年06月13日 09:31:19   作者:​ 孤寒者   ​  
这篇文章主要介绍了Python threading和Thread模块之线程池,线程池如消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务,具体介绍需要的小伙伴可以参考下面文章详细内容

1. 池的概念

主线程:

相当于生产者,只管向线程池提交任务。 并不关心线程池是如何执行任务的。

线程池:

相当于消费者,负责接收任务,并将任务分配到一个空闲的线程中去执行。并不关心是哪一个线程执行的这个任务。

2. 自定义线程池

# -*- coding: utf-8 -*-
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()

3. 使用Python内置线程池

# -*- coding: utf-8 -*-
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('这是程序的最后一行,执行到这里,主线程结束')

4. 池的其他操作

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

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

拓展: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。 是用来存储和交换文本信息的语法。

数据在名称/值对中 数据由逗号分隔 大括号保存对象 中括号保存数组

使用 JSON 函数需要导入 json 库:import json。

json,用于字符串 和 python数据类型间进行转换json模块提供了四个功能:dumps、dump、loads、load

  • 1.json.dumps 将 Python 对象编码成 JSON 数据
  • 2.json.dump 将 JSON 数据通过特殊的形式转换为只有 Python 认识的字符串并写入文件
  • 3.json.loads 将已编码的 JSON 数据解码为 Python 对象
  • 4.json.load 将一个包含 JSON 格式数据的可读文件解码为一个 Python 对象并写入文件

到此这篇关于Python 常用模块threading和Thread模块之线程池的文章就介绍到这了,更多相关Python线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python图片处理之图片采样处理详解

    Python图片处理之图片采样处理详解

    这篇文章将详细为大家讲解图像采样处理,包括原理知识、代码实现和局部马赛克处理。文中的示例代码讲解详细,感兴趣的可以跟随小编一起动手试一试
    2022-02-02
  • 利用Python实现简单的验证码处理

    利用Python实现简单的验证码处理

    这篇文章主要介绍了利用Python实现简单的验证码处理,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • python列表详情

    python列表详情

    这篇文章主要介绍了python列表详情,python没有数组,而是引入了列表(list),列表可以存储任何类型的数据,而且同一个列表中的数据类型也可以不同,下面一起来看文章详细内容吧
    2021-12-12
  • 深入浅析Python 中的sklearn模型选择

    深入浅析Python 中的sklearn模型选择

    这篇文章主要介绍了Python sklearn模型选择的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • 使用Django2快速开发Web项目的详细步骤

    使用Django2快速开发Web项目的详细步骤

    这篇文章主要介绍了使用Django2快速开发Web项目的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • 对python中两种列表元素去重函数性能的比较方法

    对python中两种列表元素去重函数性能的比较方法

    今天小编就为大家分享一篇对python中两种列表元素去重函数性能的比较方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python抓取百度首页的方法

    python抓取百度首页的方法

    这篇文章主要介绍了python抓取百度首页的方法,涉及Python使用urllib模块实现页面抓取的相关技巧,需要的朋友可以参考下
    2015-05-05
  • python装饰器底层原理详解

    python装饰器底层原理详解

    这篇文章主要介绍了python装饰器底层原理讲解,被装饰对象加上装饰器,被装饰对象获得了更强大的功能,更多相关内容,需要的朋友可以参考一下
    2022-07-07
  • Python脚本在Appium库上对移动应用实现自动化测试

    Python脚本在Appium库上对移动应用实现自动化测试

    这篇文章主要介绍了使用Python的Appium库对移动应用实现自动化测试的教程,属于Python脚本的一个自动化应用,需要的朋友可以参考下
    2015-04-04
  • 给Python学习者的文件读写指南(含基础与进阶)

    给Python学习者的文件读写指南(含基础与进阶)

    今天,猫猫跟大家一起,好好学习Python文件读写的内容,这部分内容特别常用,掌握后对工作和实战都大有益处,学习是循序渐进的过程,欲速则不达
    2020-01-01

最新评论