一、线程池

系统频繁的启动新线程,线程执行完被销毁,如果线程不能被重复使用,即每个线程都需要经过启动、销毁和运行3个过程,
这必然会使得系统的性能急剧下降,线程池的意义就在于减少线程创建及消毁过程中损失的系统资源

线程池在程序运行时创建大量空闲线程,程序只需将要执行的任务交给线程池,线程池就会启动一个空闲的线程来执行,
当任务执行完后,该线程并不会死亡销毁,而是再次返回到线程池中变成空闲状态,等待一下次被启动

二、concurrent.futures模块

concurrent.futures.Executor类
线程池的基类,不应该直接使用该基类,通过其具体子类使用

EXecutor类包含两个子类

concurrent.futures.ThreadPoolExecutor(max_workers=None, thread_name_prefix='', initializer=None, initargs=())
用于创建线程池
max_workers: 线程池中线程的个数,Python3.8版本中,默认min(32, os.cpu_count()+4)
thread_name_prefix: Python3.6版新增的参数,线程池中启动线程的名字
initializer,initargs: Python3.7版中新增的参数,初始化线程池的程序和要传入程序的参数 concurrent.futures.ProcessPoolExecutor(max_workers=None, mp_context=None, initializer=None, initargs=())
用于创建进程池
max_workers: 进程池中进程的个数,默认处理器的个数
mp_context: Python3.7版中新增的参数,允许用户控制进程池中进程的start_method
initializer,initargs: 初始化线程池的程序和要传入程序的参数

线程池对象方法

ThreadPoolExecutor.submit(fn, *args, **kwargs)
线程池执行的任务,返回可调用的 Future 对象
fn: 线程池要执行的函数
*args: 传递给fn函数的参数
**kwargs: 关键字形式传递给fn函数的参数 ThreadPoolExecutor.map(func, *iterables, timeout=None, chunksize=1)
类似于 map(func, *iterables) 函数,启动多个线程以异步方式对 iterables 执行 func
timeout: 超时时间,int或float类型,超时引发 concurrent.futures.TimeoutError 异常 ThreadPoolExecutor.shutdown(wait=True)
关闭线程池,不再接收新线程任务,关闭后调用 submit() 和map() 引发 RuntimeError 异常
wait: 默认True,执行完所有线程后在关闭线程池;False表示立即关闭线程池,但是线程还是可以执行

Future对象的方法

Future类封装了一个可调用的异步执行结果对象,Future对象由 submit() 方法创建

Future.cancel()
取消当前Future代表的线程任务
若当前任务正在执行,无法取消,返回 False,否则,该任务被取消并且返回 True Future.cancelled()
当前Future代表的线程任务被成功取消返回 True Future.running()
当前Future代表的线程任务正在执行,无法取消,返回 Ture Future.done()
当前Future代表的线程任务被取消或完成返回 True Future.result(timeout=None)
返回当前Future代表的线程任务执行的结果
timeout: 等待当前Future代表的线程任务执行结果的最大超时时间,int或float类型,默认None,永不超时;若超时,引发 concurrent.futures.TimeoutError 异常 Future.exception(timeout=None)
返回当前Future代表的线程任务执引发的异常,如没有引发任何异常,返回 False
timeout: 等待当前Future代表的线程任务执行结果的最大超时时间,int或float类型,默认None,永不超时;若超时,引发 concurrent.futures.TimeoutError 异常 Future.add_done_callback(fn)
当前Future代表的线程任务被取消或者完成,执行的函数

示例

import threading
from concurrent.futures import ThreadPoolExecutor #账户类
class Account:
def __init__(self, account_no, balance):
#账户编号和账户余额
self.account_no = account_no
self.balance = balance self._flag = False
self.cond = threading.Condition() def getBlance(self):
return self.balance #提取现金方法
def draw(self, draw_amount):
with self.cond:
if not self._flag:
self.cond.wait()
else:
if self.balance >= draw_amount:
print(threading.current_thread().name+'\t取钱成功!吐出钞票:'+str(draw_amount))
self.balance -= draw_amount
print(threading.current_thread().name+'操作之后\t余额为:'+str(self.balance))
else:
print(threading.current_thread().name+'\t取钱失败!余额不足!\t当前余额为:'+str(self.balance))
self._flag = False
self.cond.notify_all() #存钱方法
def deposit(self, deposit_amount):
with self.cond:
if self._flag:
self.cond.wait()
else:
print(threading.current_thread().name+'\t存钱成功!存入钞票:'+str(deposit_amount))
self.balance += deposit_amount
print(threading.current_thread().name+'操作之后\t余额为:'+str(self.balance))
self._flag = True
self.cond.notify_all() acct = Account('986623', 1000) with ThreadPoolExecutor(100, thread_name_prefix='Account_Thread_Pool') as pools:
for i in range(50):
pools.submit(acct.deposit, 1000)
pools.submit(acct.draw, 900)

Python3之并发(六)---线程池的更多相关文章

  1. (CSDN迁移) JAVA多线程实现-可控最大并发数线程池(newFixedThreadPool)

    上篇文章中介绍了单线程化线程池newSingleThreadExecutor,可控最大并发数线程池(newFixedThreadPool)与其最大的区别是可以通知执行多个线程,可以简单的将newSin ...

  2. JUC学习笔记——并发工具线程池

    JUC学习笔记--并发工具线程池 在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍: 线程池介绍 自定义线程池 模式之Worker Thr ...

  3. java并发:线程池、饱和策略、定制、扩展

    一.序言 当我们需要使用线程的时候,我们可以新建一个线程,然后显式调用线程的start()方法,这样实现起来非常简便,但在某些场景下存在缺陷:如果需要同时执行多个任务(即并发的线程数量很多),频繁地创 ...

  4. java多线程系列(六)---线程池原理及其使用

    线程池 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知 ...

  5. java之并发编程线程池的学习

    如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. java.uitl.concurrent.Thre ...

  6. Linux + C + Epoll实现高并发服务器(线程池 + 数据库连接池)(转)

    转自:http://blog.csdn.net/wuyuxing24/article/details/48758927 一, 背景 先说下我要实现的功能,server端一直在linux平台下面跑,当客 ...

  7. Executor并发框架--线程池,ThreadToolExecutor初步

    Executor存在的目的是提供一种将"任务提交"与"任务如何运行"分离开来的机制.虽然只有一个方法,但是却为灵活且强大的异步任务执行框架提供了基础.它提供了一 ...

  8. Java高性能并发编程——线程池

    在通常情况下,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的 ...

  9. 《java学习三》并发编程 -------线程池原理剖析

    阻塞队列与非阻塞队 阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到 ...

  10. Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式

    前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...

随机推荐

  1. docker tar包下载地址

    https://download.docker.com/linux/static/stable/x86_64/

  2. vim 小记录

    将str1批量替换成str2 , 特殊符号前用转译符 \ :%s/str1/str2/g

  3. 关于MounRiver编译器配置的若干问题

    目录 一.在工程中单独设置预编译宏 二.将变量存放到指定RAM地址 三.串口打印浮点数 四.添加64位数据处理 五.使用math数学库 六.关闭仿真时自动清dataflash功能 七.配置printf ...

  4. layui伸缩左侧菜单栏,已伸缩成功但是右侧主体部分不动

    <ul class="layui-nav layui-nav-tree" lay-filter="test" style="width:200p ...

  5. HIVE- 删除功能

    删除分区: ALTER TABLE table_name DROP PARTITION (partition_name='20220101');

  6. HTML&CSS学习总结

    目录 一. HTML学习总结 1.HTML是什么 2.HTML结构 1. 创建一个HTML实例 2. HTML结构解析 3. HTML标题 4. HTML段落 5. HTML链接 6. HTML图像 ...

  7. jdbc(工具类和配置文件)

    原始的jdbc要操作7步 导入jar包 加载驱动 获取连接 获取执行者对象 编写sql语句 处理结果 释放对象资源 当我们每次都要注册驱动,获取连接的时候,都感觉很烦,这时候怎么才能懒呢? 把driv ...

  8. Self-Attention学习

    2个连接+1个视频推荐 Self-Attention 原理与代码实现_DonngZH的博客-CSDN博客_selfattention代码 Transformer模型详解(图解最完整版) - 知乎 (z ...

  9. DAC双通道模板

    #define DAC_C #include "dac.h" float DAC_DispenseA; float DAC_DispenseB; void MyDAC_Init(v ...

  10. vscode将本地代码实时同步到服务器

    vscode近些年变得越来越流行了,主要是IDEA用上去实在有点卡,机器卡崩溃几次,这段时间也想用vscode体验一下,在自己的一些项目上面,想实现像phpstorm或者goland那样直接把代码通过 ...