python进程之进程池、线程池与异步回调机制
进程线程不可以无限制的创建,因为有硬件的限制。为了避免资源被程序消耗过度,可以使用进程池或线程池的技术。
池
降低程序的执行效率,但是保证了计算机硬件的安全
进程池
提前创建好固定数量的进程,供后续程序的调用,超出则进入等待状态
线程池
提前创建好固定数据的线程,供后续程序的调用,超出则进入等待状态
PS:
当一个程序计算数量的程序较多时,使用进程池。
当一个程序I/O的程序较多时,使用线程池。
(因为GIL锁的原因,每个进程中同一时间只能有一个进程链接cpu)
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import os
import time
import random
# 1. 产生含有固定数量线程的线程池
# t_pool = ThreadPoolExecutor() # 默认线程数(max_workers = min(32, (os.cpu_count() or 1) + 4))
t_pool = ThreadPoolExecutor(20) # 产生有20个线程的线程池
p_pool = ProcessPoolExecutor(5)
def task():
print('task is running')
time.sleep(random.randint(1, 3))
print('task is over')
return 'task函数返回值'
def func(a):
print(f'我拿到返回值了>>>:{a.result()}')
# 2.将任务提交给线程池
for i in range(200): # 定义200个任务
t_pool.submit(task) # 将任务交给线程池
# 3. 将任务提交给进程池
# 执行过程中,可以按到程序是一波一波的运行,每一波就是你定义进程的数量
if __name__ == '__main__':
for i in range(20):
p_pool.submit(task)
# 4.要获得函数运行结果的返回值
if __name__ == '__main__':
for i in range(20):
# 将task函数返回值传给func函数,func函数拿到返回值可以去干别的事去了
p_pool.submit(task).add_done_callback(func) # 异步回调机制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)