线程池&进程池
线程池&进程池
池子解决什么问题?
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 ...
随机推荐
- SpringBoot 整合 Elasticsearch深度分页查询
es 查询共有4种查询类型 QUERY_AND_FETCH: 主节点将查询请求分发到所有的分片中,各个分片按照自己的查询规则即词频文档频率进行打分排序,然后将结果返回给主节点,主节点对所有数据进行汇总 ...
- 运用wxs制作微信小程序左滑功能和跳转,性能更优越
锲子 微信小程序自定义左滑功能加上跳转,换成以往,左滑功能的逻辑一般是在js中实现,但在拖动方面,性能并不是那么的流畅.如今,官方新扩展了一套脚本语言wxs,在IOS设备上运行,性能会比JS快2~20 ...
- 论文阅读 Prefetch-aware fingerprint cache management for data deduplication systems
论文链接 https://link.springer.com/article/10.1007/s11704-017-7119-0 这篇论文试图解决的问题是在cache 环节之前,prefetch-ca ...
- [考试反思]1013csp-s模拟测试72:距离
最近总是这个样子. 看上去排名好像还可以,但是实际上离上面的分差往往能到80分,但是身后的分差其实只有10/20分. 比上不足,比下也不怎么的. 所以虽然看起来没有出rank10,但是在总分排行榜上却 ...
- 使用Typescript重构axios(二十二)——请求取消功能:收尾
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- 「Usaco2005 Dec」清理牛棚(spfa秒杀线段树dp)
约翰的奶牛们从小娇生惯养,她们无法容忍牛棚里的任何脏东西. 约翰发现,如果要使这群有洁癖的奶牛满意,他不得不雇佣她们中的一些来清扫牛棚, 约翰的奶牛中有N(1≤N≤10000)头愿意通过清扫牛棚来挣一 ...
- 获取Ubuntu的Docker CE
Docker文档 Docker提供了一种在容器中运行安全隔离的应用程序的方法,它与所有依赖项和库打包在一起. 获取Ubuntu的Docker CE 一.OS要求 需要以下Ubuntu版本的x86_64 ...
- idea 常用功能
Ctrl + E:打开最近文件 双击 Shift:按文件名查找文件 Ctrl + Shift + F:全局搜索 Alt + ~(数字 1 左边的键):commit.push 代码 ...
- 怎样用JS给,option添加“选中”属性
<html> <head> <script> window.onload = function(){ var opts = document.getElementB ...
- nyoj 349 (poj 1094) (拓扑排序)
Sorting It All Out 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 An ascending sorted sequence of distinct ...