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

目录
  • 1. 池的概念
  • 2. 自定义线程池
  • 3. 使用Python内置线程池
  • 4. 池的其他操作

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

(0)

相关推荐

  • python线程池threadpool使用篇

    最近在做一个视频设备管理的项目,设备包括(摄像机,DVR,NVR等),包括设备信息补全,设备状态推送,设备流地址推送等,如果同时导入的设备数量较多,如果使用单线程进行设备检测,那么由于设备数量较多,会带来较大的延时,因此考虑多线程处理此问题. 可以使用python语言自己实现线程池,或者可以使用第三方包threadpool线程池包,本主题主要介绍threadpool的使用以及其里面的具体实现. 1.安装 使用安装: pip installthreadpool 2.使用 (1)引入threadpo

  • Python 使用threading+Queue实现线程池示例

    一.线程池 1.为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率. 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3>T2,那说明开启一个线程来执行这个任务太不划算了!在线程池缓存线程可用已有的闲置线程来执行新任务,避免了创建/销毁带来的系统开销. 1.2 线程并发数量过多,抢占系统资源从而导致阻塞. 线程能共享系统资源,如果同时执行的线程过多,就有可能导致系统资源不足而产生阻塞的情况. 1.3 对线

  • python线程池(threadpool)模块使用笔记详解

    最近在做一个视频设备管理的项目,设备包括(摄像机,DVR,NVR等),包括设备信息补全,设备状态推送,设备流地址推送等,如果同时导入的设备数量较多,如果使用单线程进行设备检测,那么由于设备数量较多,会带来较大的延时,因此考虑多线程处理此问题. 可以使用python语言自己实现线程池,或者可以使用第三方包threadpool线程池包,本主题主要介绍threadpool的使用以及其里面的具体实现. 一.安装与简介 pip install threadpool pool = ThreadPool(po

  • python线程池 ThreadPoolExecutor 的用法示例

    前言 从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进程池)两个类. 相比 threading 等模块,该模块通过 submit 返回的是一个 future 对象,它是一个未来可期的对象,通过它可以获悉线程的状态主线程(或进程)中可以获取某一个线程(进程)执行的状态或者某一个任务执行的状态及返回值: 主线程可以获取某一个线程(或者任务的)的状态,以及返

  • 解决python ThreadPoolExecutor 线程池中的异常捕获问题

    问题 最近写了涉及线程池及线程的 python 脚本,运行过程中发现一个有趣的现象,线程池中的工作线程出现问题,引发了异常,但是主线程没有捕获异常,还在发现 BUG 之前一度以为线程池代码正常返回. 先说重点 这里主要想介绍 python concurrent.futuresthread.ThreadPoolExecutor 线程池中的 worker 引发异常的时候,并不会直接向上抛起异常,而是需要主线程通过调用concurrent.futures.Future.exception(timeou

  • python3线程池ThreadPoolExecutor处理csv文件数据

    目录 背景 知识点 拓展 库 流程 实现代码 解释 背景 由于不同乙方对服务商业务接口字段理解不一致,导致线上上千万数据量数据存在问题,为了修复数据,通过 Python 脚本进行修改 知识点 Python3.线程池.pymysql.CSV 文件操作.requests 拓展 当我们程序在使用到线程.进程或协程的时候,以下三个知识点可以先做个基本认知 CPU 密集型.IO 密集型.GIL 全局解释器锁 库 pip3 install requests pip3 install pymysql 流程 实

  • python线程池threadpool实现篇

    本文为大家分享了threadpool线程池中所有的操作,供大家参考,具体内容如下 首先介绍一下自己使用到的名词: 工作线程(worker):创建线程池时,按照指定的线程数量,创建工作线程,等待从任务队列中get任务: 任务(requests):即工作线程处理的任务,任务可能成千上万个,但是工作线程只有少数.任务通过          makeRequests来创建 任务队列(request_queue):存放任务的队列,使用了queue实现的.工作线程从任务队列中get任务进行处理: 任务处理函

  • Python线程池模块ThreadPoolExecutor用法分析

    本文实例讲述了Python线程池模块ThreadPoolExecutor用法.分享给大家供大家参考,具体如下: python3内置的有Threadingpool和ThreadPoolExecutor模块,两个都可以做线程池,当然ThreadPoolExecutor会更好用一些,而且也有ProcessPoolExecutor进程池模块,使用方法基本一致. 首先导入模块 from concurrent.futures import ThreadPoolExecutor 使用方法很简单,最常用的可能就

  • Python线程池thread pool创建使用及实例代码分享

    目录 前言 一.线程 1.线程介绍 2.线程特性 轻型实体 独立调度和分派的基本单位 可并发执行 4)共享进程资源 二.线程池 三.线程池的设计思路 四.Python线程池构建 1.构建思路 2.实现库功能函数 ThreadPoolExecutor() submit() result() cancel() cancelled() running() as_completed() map() 前言 首先线程和线程池不管在哪个语言里面,理论都是通用的.对于开发来说,解决高并发问题离不开对多个线程处理

  • 浅谈python 线程池threadpool之实现

    首先介绍一下自己使用到的名词: 工作线程(worker):创建线程池时,按照指定的线程数量,创建工作线程,等待从任务队列中get任务: 任务(requests):即工作线程处理的任务,任务可能成千上万个,但是工作线程只有少数.任务通过          makeRequests来创建 任务队列(request_queue):存放任务的队列,使用了queue实现的.工作线程从任务队列中get任务进行处理: 任务处理函数(callable):工作线程get到任务后,通过调用任务的任务处理函数即(re

随机推荐