Python并发之多线程与线程池
目录:
- 基本知识: 进程、线程与多线程
- 多线程之threading类
- 更好用的线程池类ThreadPoolExecutor
一. 线程与多线程
进程: 一个程序执行时,可以称之为一个进程,其包含运行中的程序和程序所使用的内存和系统资源.一个进程由多个线程所组成.
线程: 线程是程序中的一个执行流,每个线程都有自己的专有寄存器,同时代码区是共享的.不同的线程可以执行同样的函数.
多线程: 多线程是指程序中包含多个执行流,也即是一个程序中可以同时运行多个不同的线程来执行不同的任务,允许单个程序创建多个并行执行的线程来完成各自的任务.
多线程最大的好处: 提高CPU利用率( 尤其适用于 I/O密集型程序 , 速度提升特别明显)
进程与线程的区别:
做个简单的比喻:进程=火车,线程=车厢
- 线程在进程下行进(单纯的车厢无法运行)
- 一个进程可以包含多个线程(一辆火车可以有多个车厢)
- 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)
- 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
- 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
- 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
- 进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
- 进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"
- 进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”
引用来源: https://www.zhihu.com/question/25532384/answer/411179772
二. 多线程之 threading 类
threading类是最常用的多线程模块.创建线程的方法如下代码:
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
- group:默认为None.
- target:要执行的函数名, 记得不要带函数的括号.
- name:线程名称,默认为'Thread-N'形式.
- args:在参数target中传入的可调用对象的参数元组.
- kwargs:在参数target中传入的可调用对象的关键字参数字典.
- daemon:守护模式属性,默认为None.
线程对象的重要方法:
- start(): 开启线程.它将使得run()方法在一个独立的线程中被调用.
- run(): 此方法代表线程活动.
- join(timeout=None): 让当前调用者线程等待,直到线程结束.
- daemon: 表示该线程是否为守护线程, True或者False.
创建多线程实例:
import random
import threading
import timedef awesome_function(name):wait_time = random.randint(1, 10)print('current thread name is :{0} and wait {1} s'.format(name, wait_time))time.sleep(wait_time)print('thread {} finished.'.format(name))if __name__ == '__main__':for i in range(0, 3):t = threading.Thread(target=awesome_function, args=(i,))t.start()
可以先看一下我录制的运行结果:
上面例子开启了3个线程,3个线程并发执行任务,先完成任务的线程(time.sleep最短的)先输出结果.
三. 更好用的线程池类ThreadPoolExecutor
启动一个新线程的开销非常大,因为它涉及与操作系统的交互.在这种情况下,使用线程池可以很好地提升程序性能,尤其是当程序中需要创建大量生存期很短暂的线程时更应该考虑使用线程池.
线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它.当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待下一个函数.同时,使用线程池可以有效地控制系统中并发线程的数量.当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致Python解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数.
现在主流使用的线程池是concurrent.futures模块中的ThreadPoolExecutor:
import random
import time
from concurrent.futures import ThreadPoolExecutordef awesome_function(name):wait_time = random.randint(1, 10)print('current thread name is :{0} and wait {1} s'.format(name, wait_time))time.sleep(wait_time)print('thread {} finished.'.format(name))if __name__ == '__main__':with ThreadPoolExecutor(max_workers=3) as t:for i in range(0, 3):t.submit(awesome_function, i)
运行结果录制如下:
创建一个最大容纳数量为3的线程池对象,通过submit提交执行的函数到线程池中,若线程池中的某个线程(thread 2)执行完成,则把空闲的线程(thread 3)放入到池子中,依次类推,直到所有线程执行完成则程序结束.
Python并发之多线程与线程池相关推荐
- pool python 传参数_Python-爬虫-多线程、线程池模拟(urllib、requests、UserAgent、超时等)...
接着之前的MonkeyLei:Python-爬取页面内容(涉及urllib.requests.UserAgent.Json等) 继续练习下多线程,线程池模拟.. 我想这样: 1. 创建一个线程池,线程 ...
- Android并发之Executor(线程池)家族(二)之AtomicInteger
线程并发,那就牵扯到内存共享的问题,在并发编程中,有三个理念:原子性.可见性.有序性.这里分享一个转载. 转载:Java volatile关键字最全总结:原理剖析与实例讲解(简单易懂) 在Thread ...
- Java的多线程和线程池的使用,你真的清楚了吗?
Java的多线程和线程池的使用 多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务.开启一个线程有4种方式,在下面的文章我将详细的去讲解. 继承Thread 继承Thr ...
- 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目
阿里的面试官问了个问题,如果corepollSize=10,MaxPollSize=20,如果来了25个线程 怎么办, 答案: 当一个任务通过execute(Runnable)方法欲添加到线程池时: ...
- Java多线程之线程池配置合理线程数
Java多线程之线程池配置合理线程数 目录 代码查看公司服务器或阿里云是几核的 合理线程数配置之CPU密集型 合理线程数配置之IO密集型 1. 代码查看公司服务器或阿里云是几核的 要合理配置线程数首先 ...
- Java多线程之线程池的手写改造和拒绝策略
Java多线程之线程池的手写改造和拒绝策略 目录 自定义线程池的使用 四种拒绝策略代码体现 1. 自定义线程池的使用 自定义线程池(拒绝策略默认AbortPolicy) public class My ...
- Java多线程之线程池7大参数、底层工作原理、拒绝策略详解
Java多线程之线程池7大参数详解 目录 企业面试题 线程池7大参数源码 线程池7大参数详解 底层工作原理详解 线程池的4种拒绝策略理论简介 面试的坑:线程池实际中使用哪一个? 1. 企业面试题 蚂蚁 ...
- Java多线程之线程池详解
Java多线程之线程池详解 目录: 线程池使用及优势 线程池3个常用方式 线程池7大参数深入介绍 线程池底层工作原理 1. 线程池使用及优势 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务 ...
- Qt多线程-QThreadPool线程池与QRunnable
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThreadPool线程池与QRunnable 本文地址:http:// ...
最新文章
- 【视频】V4L2之ioctl
- 我是越来越喜欢做产品了
- .NET开发的一些积累
- linux下安装mysql5.7.17及简单配置
- 蓝桥杯-关联矩阵(java)
- Linux(Ubuntu)下嵌入式gdb调试环境
- html table设置行高_html 表格单元格的宽度和高度的设置方法
- 可以无限增加iPhone 的图标吗?
- 辅助排序和Mapreduce整体流程
- linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?
- 面试java回答优缺点_面试时被问“你有什么优缺点”应该怎么回答?
- 计算机SCV原理指什么,csv是什么文件格式?.csv文件怎么打开?
- nginx设置IP、文件目录、请求头白名单
- python中遇到报错OSError: [Errno 22] Invalid argument的解决方法
- 计算机屏幕出现条纹w7,win7电脑屏幕出现条纹四种原因和解决方法
- 存储过程实现银行转账的简易操作
- 【微服务】Nacos通知客户端服务变更以及重试机制
- 激光雷达进入前装上车“蜜月期”,部分厂商备战2024年“决战”
- php机器码领取,通过IP和机器码来限制用户领取奖励脚本
- 分享几个常用的前端工具网站
热门文章
- 2021年必读的12本机器学习书籍
- CC2530的通用IO端口(GPIO)输入和输出控制
- js php 手机验证码代码怎么写,JS实现简单短信验证码界面
- r54600h和r55600u哪个好
- java8 toMap(key重复如何解决)
- 基于Springboot在线拍卖竞拍系统(java springboot FreeMarker mysql )1001
- android ppt 转图片显示不全,PPT转PDF图片显示不全怎么办?如何完美解决PPT转PDF文件?...
- MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)协议
- 苏宁“星际家园”正式上线,区块链电商之战已打响
- 关于编程与数学的名言金句——字字珠玑