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线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PyCharm 光标变成黑块的解决方式

    PyCharm 光标变成黑块的解决方式

    这篇文章主要介绍了PyCharm 光标变成黑块的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • python里大整数相乘相关技巧指南

    python里大整数相乘相关技巧指南

    对于大整数计算,一般都要用某种方法转化,否则会溢出。但是python无此担忧了。Python支持“无限精度”的整数,一般情况下不用考虑整数溢出的问题,而且Python Int类型与任意精度的Long整数类可以无缝转换,超过Int 范围的情况都将转换成Long类型。
    2014-09-09
  • 使用Python的urllib和urllib2模块制作爬虫的实例教程

    使用Python的urllib和urllib2模块制作爬虫的实例教程

    这篇文章主要介绍了使用Python的urllib和urllib2模块制作爬虫的实例教程,展现了这两个常用爬虫制作模块的基本用法,极度推荐!需要的朋友可以参考下
    2016-01-01
  • Python 在区块链智能合约开发中的应用与实践小结

    Python 在区块链智能合约开发中的应用与实践小结

    Python作为一种广泛应用的编程语言,在区块链智能合约开发中扮演着重要角色,通过使用Python框架如Brownie和Web3.py,开发者可以轻松编写和部署智能合约,感兴趣的朋友一起看看吧
    2024-09-09
  • python爬虫请求头设置代码

    python爬虫请求头设置代码

    在本篇文章里小编给大家整理的是一篇关于python爬虫请求头如何设置内容,需要的朋友们可以学习下。
    2020-07-07
  • Python从List中删除重复项的六种方法

    Python从List中删除重复项的六种方法

    Python从列表中删除重复项的方法,在本文中列出了6种方法,这些方法在许多应用程序中都会遇到,作为程序员,我们最好了解它们,以便在需要时编写有效的程序,感兴趣的小伙伴跟着小编一起来看看吧
    2024-10-10
  • 解决Python 写文件报错TypeError的问题

    解决Python 写文件报错TypeError的问题

    这篇文章主要介绍了解决Python 写文件报错TypeError的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • python实现的发邮件功能示例

    python实现的发邮件功能示例

    这篇文章主要介绍了python实现的发邮件功能,结合实例形式分析了Python使用网易邮箱发送邮件的相关操作技巧,需要的朋友可以参考下
    2019-09-09
  • 用python实现面向对像的ASP程序实例

    用python实现面向对像的ASP程序实例

    这篇文章主要介绍了用python实现面向对像的ASP程序,实例讲述了使用Python实现ASP程序的方法,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-11-11
  • 基于python实现坦克大战游戏

    基于python实现坦克大战游戏

    这篇文章主要为大家详细介绍了基于python实现坦克大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论