线程池和进程池

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import os
import time

'''
进程池与线程池

开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少

在计算机能够承受范围之内最大限度的利用计算机


什么是池?
    在保证计算机硬件安全的情况下最大限度的利用计算机
    池其实是降低了程序的运行效率 但是保证了计算机硬件的安全
    (硬件的发展跟不上软件的速度)
'''

# pool = ThreadPoolExecutor()  # 括号内可以传参数指定线程池内的线程个数
# 也可以不穿默认的是计算机cpu个数乘以5

pool = ProcessPoolExecutor()  # 不传,默认参数为cpu个数
'''
池子中创建的进程或者线程创建一次就不会再创建了
至始至终用的都是最初的几个
这样的话节省了反复开辟进程或者线程的资源
'''


def task(n):
    print(n,    os.getpid())
    time.sleep(2)
    return n**2, n


def call_back(x):
    print(x)
    print('拿到了异步提交任务的返回结果:', x.result())


# if __name__ == '__main__':
#     pool.submit(task, 2)  # 朝线程池/进程池提交任务,异步提交
#     print('zhu')
'''
异步提交任务之后,不等任务的返回结果(异步的结果怎么拿???),直接执行下一行代码
异步回调机制:当异步提交的任务有返回结果之后,会自动触发回调函数的执行
'''

if __name__ == '__main__':
    t_list = []
    for i in range(40):
        # res = pool.submit(task, i)
        res = pool.submit(task, i).add_done_callback(call_back)  # 提交任务的时候 绑定一个回调函数 一旦该任务有结果  立刻执行绑定的回调函数
        # print(res.result())  # 原地等待任务的返回结果,把并行变成串行
        # t_list.append(res)

    # pool.shutdown()  # 关闭池子 等待池子中所有的任务执行完毕之后 才会执行下面的代码
    # for p in t_list:
    #     print('>>>:', p.result())

 

posted @ 2019-08-18 16:28  Nmdlao  阅读(120)  评论(0编辑  收藏  举报