• (19)ThreadPoolExecutor线程池


    # 线程池

    # 实例化线程池 ThreadPoolExcutor (推荐cpu_count*(n+1))

    # 异步提交任务 submit / map

    # 阻塞直到任务完成 shutdown

    # 获取子线程的返回值 result

    # 使用回调函数 add_done_callback

    (1)基本用法:

    from concurrent.futures import ThreadPoolExecutor
    
    def func(i):
    
        print("thread is start",i)
    
        print("thread is end ")
    
    if __name__ == "__main__":
    
        p = ThreadPoolExecutor(5)
    
        p.submit(func,1)  #启动线程
    
        p.shutdown()  # 相当于join+close
    
    print("主线程")
    View Code

    执行结果:

    thread is start 1
    thread is end 
    主线程
    View Code

    (2)返回值 ( 通过对象.result()拿到结果 )

    from concurrent.futures import ThreadPoolExecutor
    def func(i):
        print("thread %s start" % (i))
        print("thread %s end" % (i))
        return i * "*"
    tp = ThreadPoolExecutor(5)
    lst = []
    for i in range(20):
        res = tp.submit(func,i) #返回值也是对象
        lst.append(res)
    tp.shutdown()
    for res in lst:
        print(res.result())
    View Code

    执行结果:

    thread 0 start
    thread 0 end
    thread 1 start
    thread 2 start
    thread 1 endthread 2 end
    
    thread 3 start
    thread 3 end
    thread 4 start
    thread 4 end
    thread 5 startthread 6 startthread 7 start
    thread 7 end
    thread 8 start
    thread 8 end
    
    thread 9 start
    
    thread 6 end
    thread 10 start
    thread 10 end
    thread 11 start
    thread 11 end
    thread 12 start
    thread 12 end
    thread 13 start
    thread 13 end
    thread 14 start
    thread 14 end
    thread 15 startthread 9 endthread 5 end
    thread 16 start
    thread 16 end
    thread 17 start
    thread 15 end
    thread 18 start
    thread 18 end
    thread 19 start
    thread 17 end
    
    thread 19 end
    
    
    *
    **
    ***
    ****
    *****
    ******
    *******
    ********
    *********
    **********
    ***********
    ************
    *************
    **************
    ***************
    ****************
    *****************
    ******************
    *******************
    主线程
    View Code

    (3)map 返回生成器

    from concurrent.futures import ThreadPoolExecutor
    from threading import current_thread as ct
    def func(i):
        print("thread",i,ct().ident)
        print("thread %s end" % (i))
        return i * "*"
    tp = ThreadPoolExecutor(5)
    res = tp.map(func,range(20))
    tp.shutdown()
    for i in res: # 生成器
        print(i)
    View Code

    执行结果:

    thread 0 9336
    thread 0 end
    thread 1 9336
    thread 1 end
    thread 2 9336
    thread 2 end
    thread 3 3348
    thread 3 end
    thread 4 10116
    thread 4 end
    thread 5 3348
    thread 5 endthread
    thread thread7   8 9292
    thread 8 end
    6 thread 9 9336
    thread 6 end
    thread9292
    thread 9 end
    thread 11 10 9336 9292
    
    threadthread 10 end
    thread 13 thread3348
     thread 11 end
    thread 15 thread 7 end
    thread 16 12 9292
    thread 15 end
    14 3348
    thread 16 end
    10116
    thread 14 endthread 17 3348
    thread 17 end
    thread  thread 19 3348
    thread 19 end
    
    10068933618
    
    thread 13 end
    thread 12 end 9292
    
    thread 18 end
    
    *
    **
    ***
    ****
    *****
    ******
    *******
    ********
    *********
    **********
    ***********
    ************
    *************
    **************
    ***************
    ****************
    *****************
    ******************
    *******************
    View Code

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    putty配置
    BroadcastReceiver应用详解 (转)
    linux主设备号和次设备号
    Enable screen lock and HOME key (eclair and older versions)(转)
    C#获取用户桌面等特殊系统路径
    java中Thread与Runnable的区别
    博文索引
    FlinkCDC实践
    关于libxml2.so.2不被Gstreamer链接的解决
    s.length什么意思
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787398.html
Copyright © 2020-2023  润新知