zoukankan      html  css  js  c++  java
  • 线程池和进程池

    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())
  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/asdaa/p/11372818.html
Copyright © 2011-2022 走看看