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)  # 异步回调机制

posted @   树苗叶子  阅读(356)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示