线程池&进程池
线程池&进程池
池子解决什么问题?
1.创建/销毁线程伴随着系统开销,如果过于频繁会影响系统运行效率
2.线程并发数量过多,抢占系统资源,从而导致系统阻塞甚至死机
3.能够刚好的控制和管理池子里面的线程和进程
concurrent.futures模块提供了高度封装的异步调用接口
ThreadPoolExecutor:线程池,提供异步调用
ProcessPoolExecutor:进程池,提供异步调用
常用方法
submit(fn, *args, **kwargs):异步提交任务
map(func, *iterables, timeout=None, chunksize=1):取代for循环submit的操作
shutdown(wait=True):相当于进程池的pool.close()+pool.join()操作
wait=True,等待池内所有任务执行完毕回收完资源后才继续
wait=False,立即返回,并不会等待池内的任务执行完毕
但不管wait参数为何值,整个程序都会等到所有任务执行完毕
submit和map必须在shutdown之前
result(timeout=None):取得结果
add_done_callback(fn):回调函数
done():判断某一个线程是否完成
cancle():取消某个任务
例1 基本用法
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,time,random
def work(i):
print(f"work-{i}搬了一块砖头")
time.sleep(1)
return "zx"
if __name__ == '__main__':
executor=ProcessPoolExecutor(max_workers=3)
#工人们
futures=[]
for i in range(11):
future=executor.submit(work,i)
futures.append(future)
#线程池shutdown 关闭入口,等待所有任务结束
executor.shutdown(True)
#打印执行的结果
for future in futures:
print(future.result())
work-0搬了一块砖头
work-1搬了一块砖头
work-2搬了一块砖头
work-3搬了一块砖头
work-4搬了一块砖头
work-5搬了一块砖头
work-6搬了一块砖头
work-7搬了一块砖头
work-8搬了一块砖头
work-9搬了一块砖头
work-10搬了一块砖头
zx
zx
zx
zx
zx
zx
zx
zx
zx
zx
zx
注意这样用会是不对的
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,time,random
def work(i):
print(f"work-{i}搬了一块砖头")
time.sleep(1)
return "zx"
if __name__ == '__main__':
executor=ProcessPoolExecutor(max_workers=3)
for i in range(11):
future=executor.submit(work,i)
print(future.result())
work-0搬了一块砖头
zx
work-1搬了一块砖头
zx
work-2搬了一块砖头
zx
work-3搬了一块砖头
zx
work-4搬了一块砖头
zx
work-5搬了一块砖头
zx
work-6搬了一块砖头
zx
work-7搬了一块砖头
zx
work-8搬了一块砖头
zx
work-9搬了一块砖头
zx
work-10搬了一块砖头
zx
例2 基础线程池加回调用法
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import threading
import time,random
def work(i):
#获取当前线程对象
thread = threading.current_thread()
print(f"{thread.getName()}搬了第{i}块砖头")
time.sleep(random.randint(1,3))
return i
def call_back(zx):
res = zx.result()
print(res)
if __name__ == '__main__':
#线程池为可装线程3个
executor=ThreadPoolExecutor(max_workers=3)
for i in range(11):
executor.submit(work,i).add_done_callback(call_back)
ThreadPoolExecutor-0_0搬了第0块砖头
ThreadPoolExecutor-0_1搬了第1块砖头
ThreadPoolExecutor-0_2搬了第2块砖头
0
ThreadPoolExecutor-0_0搬了第3块砖头
2
ThreadPoolExecutor-0_2搬了第4块砖头
1
ThreadPoolExecutor-0_1搬了第5块砖头
3
ThreadPoolExecutor-0_0搬了第6块砖头
5
ThreadPoolExecutor-0_1搬了第7块砖头
4
ThreadPoolExecutor-0_2搬了第8块砖头
6
ThreadPoolExecutor-0_0搬了第9块砖头
9
ThreadPoolExecutor-0_0搬了第10块砖头
7
8
10
例3 进程池加回调函数
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import time,random,os
def work(i):
#打印当前进程pid
print(f"{os.getpid()}搬了第{i}块砖头")
time.sleep(random.randint(1,3))
return i
def call_back(zx):
res = zx.result()
print(res)
if __name__ == '__main__':
#线程池为可装线程3个
executor=ProcessPoolExecutor(max_workers=3)
for i in range(11):
executor.submit(work,i).add_done_callback(call_back)
18696搬了第0块砖头
22500搬了第1块砖头
4172搬了第2块砖头
22500搬了第3块砖头
1
22500搬了第4块砖头
3
18696搬了第5块砖头
0
4172搬了第6块砖头
2
22500搬了第7块砖头
4
18696搬了第8块砖头
5
18696搬了第9块砖头
8
4172搬了第10块砖头
6
7
9
10
线程池&进程池的更多相关文章
- Python并发编程之线程池&进程池
引用 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...
- Python并发编程之线程池/进程池--concurrent.futures模块
一.关于concurrent.futures模块 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/ ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制
1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 """先进先出 队列"& ...
- Python3【模块】concurrent.futures模块,线程池进程池
Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要 ...
- GIL 线程池 进程池 同步 异步 阻塞 非阻塞
1.GIL 是一个全局解释器锁,是一种互斥锁 为什么需要GIL锁:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现 ...
- GIL 线程池 进程池 同步 异步
1.GIL(理论 重点)2.线程池 进程池3.同步 异步 GIL 是一个全局解释器锁,是一个互斥锁 为了防止竞争解释器资源而产生的 为何需要gil:因为一个python.exe进程中只有一份解释器,如 ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- 12 并发编程-(线程)-线程queue&进程池与线程池
queue 英 /kjuː/ 美 /kju/ 队列 1.class queue.Queue(maxsize=0) #队列:先进先出 import queue q=queue.Queue() q.put ...
随机推荐
- 使用asp.net core 3.0 搭建智能小车1
跟随.net core 3.0 一起发布的System.Device.Gpio 1.0已经可以让我们用熟悉的C#原汁原味的开发莓派上面的GPIO了.并且在 Iot.Device.Bindings这个包 ...
- html中<button>标签的type
HTML的<button>标签的type主要有三种可选值,reset.submit.button. 其中reset为重置按钮,用于清除form表单的数据:submit为提交按钮,点击后会对 ...
- [Flink]Flink1.6三种运行模式安装部署以及实现WordCount
前言 Flink三种运行方式:Local.Standalone.On Yarn.成功部署后分别用Scala和Java实现wordcount 环境 版本:Flink 1.6.2 集群环境:Hadoop2 ...
- kettle数据同步的5中方案
数据同步:当数据源发生改变时,其他相关数据也跟着发展变化.根据需求不同可采取以下方案.1.触发器:在数据库建立增删改的触发器.触发器将变更放到一张临时表里.oracle同步cdc优点:实时同步缺点:影 ...
- Docker常见报错解决方法记录
[问题一]OCI runtime exec failed......executable file not found in $PATH": unknown [root@localhost ...
- 大数据之路week01--自学之面向对象java(static,this指针(初稿))
函数的重载 返回值不一样会报错 java中,如果自己定义了构造函数的话,它就不会给你默认一个无参函数 如果一个属性,只进行定义,不初始化,自动补0,如果是一个布尔属性,默认是false但是如果一个局部 ...
- 2、Linux基础练习题
题目 答案 1.答案 [root@centos7 ~]# date +'%F %T' 2019-07-23 10:21:35 2.答案 [root@centos7 ~]# date +%A -d '- ...
- MyBatis:统计数量(查询所有)
返回值的类型:resultType="java.lang.Integer". <select id="count" resultType="ja ...
- UEFI+GPT电脑Win10下安装openSUSE Leap 42.2双系统
安装过程仅供参考,最后实现方式不完美. 1 准备工具,一个8G以上U盘,已装好win10的UEFI+GPT电脑(本机为SSD+HDD双硬盘) 2 所需软件: 2.1 ...
- 2018年航空概论课后作业(PS:部分答案不正确, 综合得分:83.6)
1 [单选题]航空是指载人或不载人的飞行器在地球____的航行活动. • A.高空• B.大气层内• C.宇宙• D.大气层外我的答案:B 得分: 33.3分 2 [多选题]军用飞机可分为____两大 ...