# 线程池

# 实例化线程池 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()

    p.submit(func,)  #启动线程

    p.shutdown()  # 相当于join+close

print("主线程")

执行结果:

thread is start 1
thread is end
主线程

(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())

执行结果:

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 *
**
***
****
*****
******
*******
********
*********
**********
***********
************
*************
**************
***************
****************
*****************
******************
*******************
主线程

(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)

执行结果:

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 *
**
***
****
*****
******
*******
********
*********
**********
***********
************
*************
**************
***************
****************
*****************
******************
*******************

(19)ThreadPoolExecutor线程池的更多相关文章

  1. 源码剖析ThreadPoolExecutor线程池及阻塞队列

    本文章对ThreadPoolExecutor线程池的底层源码进行分析,线程池如何起到了线程复用.又是如何进行维护我们的线程任务的呢?我们直接进入正题: 首先我们看一下ThreadPoolExecuto ...

  2. 13.ThreadPoolExecutor线程池之submit方法

    jdk1.7.0_79  在上一篇<ThreadPoolExecutor线程池原理及其execute方法>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法 ...

  3. ThreadPoolExecutor 线程池的源码解析

    1.背景介绍 上一篇从整体上介绍了Executor接口,从上一篇我们知道了Executor框架的最顶层实现是ThreadPoolExecutor类,Executors工厂类中提供的newSchedul ...

  4. j.u.c系列(01) ---初探ThreadPoolExecutor线程池

    写在前面 之前探索tomcat7启动的过程中,使用了线程池(ThreadPoolExecutor)的技术 public void createExecutor() { internalExecutor ...

  5. Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式

    前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...

  6. ThreadPoolExecutor 线程池

    TestThreadPoolExecutorMain package core.test.threadpool; import java.util.concurrent.ArrayBlockingQu ...

  7. 十、自定义ThreadPoolExecutor线程池

    自定义ThreadPoolExecutor线程池 自定义线程池需要遵循的规则 [1]线程池大小的设置 1.计算密集型: 顾名思义就是应用需要非常多的CPU计算资源,在多核CPU时代,我们要让每一个CP ...

  8. Executors、ThreadPoolExecutor线程池讲解

    官方+白话讲解Executors.ThreadPoolExecutor线程池使用 Executors:JDK给提供的线程工具类,静态方法构建线程池服务ExecutorService,也就是Thread ...

  9. SpringBoot项目框架下ThreadPoolExecutor线程池+Queue缓冲队列实现高并发中进行下单业务

    主要是自己在项目中(中小型项目) 有支付下单业务(只是办理VIP,没有涉及到商品库存),目前用户量还没有上来,目前没有出现问题,但是想到如果用户量变大,下单并发量变大,可能会出现一系列的问题,趁着空闲 ...

随机推荐

  1. Redis集合 安装 哨兵集群 配置

    redis相关 redis基础 redis发布订阅 redis持久化RDB与AOF redis不重启,切换RDB备份到AOF备份 redis安全配置 redis主从同步 redis哨兵集群 redis ...

  2. POJ 3078 - Shuffle'm Up - [模拟题]

    题目链接:http://poj.org/problem?id=3087 Description A common pastime for poker players at a poker table ...

  3. Feign 重试解析

    Spring cloud Feign 在restful 调用失败后,会进行重试.在没有到达指定重试次数,会一直重试. @Override public Object invoke(Object[] a ...

  4. PE就是市盈率的缩写 PB是平均市净率的缩写

    PE就是市盈率的缩写 PB是平均市净率的缩写 以下为百科知识 PE Price/Earnings 市盈率 也有叫做PER的,Price/Earnings Ratio 本益比,价格收益比,市盈率 市盈率 ...

  5. GitHub的操作

    一.查看自己的信息:git config --list 修改config文件:01.输入vim ~/.gitconfig(回车) 02.点击 i.o或a 进入编辑模式 03.修改所要修改的信息 04. ...

  6. [pat]1068 Find More Coins

    满背包问题,把体积和价值看成相等的.用滚动数组优化,然后额外开辟一个choice数组来记录每次的选择,然后回溯打印.因为要按字典序,先把价值进行排序.假如选最小的商品能装满m的话,那就把判断条件改成大 ...

  7. web前端学习历程--排序

    一.js排序方法 1.按字母顺序排列: arr.sort() 2.按数值从小到大: function sortNumber(a,b)//排序函数 { return a - b } var arr = ...

  8. 解决wine中文字体方块或乱码

    从Windows使用字体 如果有一个安装了Windows的分区, 可以通过链接它们来使用其字体. 例如, Windows的C:\盘被挂载在/windows: # ln -s /windows/Wind ...

  9. Vue学习1:实例及生命周期

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. thymeleaf 添加语法提示

    thymeleaf 添加语法提示: xmlns:th="http://www.thymeleaf.org"