线程池&进程池
线程池&进程池
池子解决什么问题?
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 ...
随机推荐
- JavaSE语法
二.JavaSE语法(上) 1.Java 有没有 goto 语句? goto 是 Java 中的保留字,在目前版本的 Java 中没有使用.根据 James Gosling(Java 之父)编写的&l ...
- 5. SOFAJRaft源码分析— RheaKV中如何存放数据?
概述 上一篇讲了RheaKV是如何进行初始化的,因为RheaKV主要是用来做KV存储的,RheaKV读写的是相当的复杂,一起写会篇幅太长,所以这一篇主要来讲一下RheaKV中如何存放数据. 我们这里使 ...
- restapi(9)- caching, akka-http 缓存
restapi作为前后端交互的枢纽:面对大批量的前端请求,需要确保回复的及时性.使用缓存是一项有效工具.我们可以把多数前端请求的回复response存入缓存,特别是一些需要大量计算才能获取的回复值,更 ...
- day 2 上午 挂饰 背包
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
- 大数据之路week01--自学之面向对象java(static,this指针(初稿))
函数的重载 返回值不一样会报错 java中,如果自己定义了构造函数的话,它就不会给你默认一个无参函数 如果一个属性,只进行定义,不初始化,自动补0,如果是一个布尔属性,默认是false但是如果一个局部 ...
- [转载]【转】教你如何实现linux和Windows之间的文件共享,samba的安
原文地址:[转]教你如何实现linux和Windows之间的文件共享,samba的安装与配置作者:铅笔小蜡 本人在虚拟机下装fedora13,已经实现.1. 首先检查os是否安装好了samba. [r ...
- python协程总结
概述 python多线程中因为有GIL(Global Interpreter Lock 全局解释器锁 )的存在,所以对CPU密集型程序显得很鸡肋:但对IO密集型的程序,GIL会在调用IO操作前释放,所 ...
- Python面向对象 | 类的成员
一. 细分类的组成成员 之前咱们讲过类大致分两块区域,静态字段部分和方法部分. 每个区域详细划分又可以分为: class A: company = '阿里巴巴' # 静态变量(静态字段) __tel ...
- EFCore批量操作,你真的清楚吗
背景 EntityFramework Core有许多新的特性,其中一个重要特性便是批量操作. 批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令,而是在一次SQL请求 ...
- 小白学 Python 爬虫(1):开篇
人生苦短,我用 Python 引言 各位同学大家好,好久不见(可能只有一两天没见:囧)~~~ 先讲一件事情,昨天为啥没更新. emmmmmmmmm,当然是因为加班啦,快到年底了,公司项目比较忙,最近的 ...