程池

springboot项目中线程池的使用

微笑、不失礼 提交于 2020-04-06 18:34:07
在application.properties添加线程池配置项 spring.task.scheduling.thread-name-prefix=SysAsyncExecutor_ spring.task.scheduling.pool.size=10 spring.task.execution.thread-name-prefix=SysAsyncExecutor_ spring.task.execution.pool.core-size=6 spring.task.execution.pool.max-size=200 spring.task.execution.pool.queue-capacity=10 spring.task.execution.pool.keep-alive=60 spring.task.execution.pool.allow-core-thread-timeout=true 公共线程池配置类 @Slf4j @Configuration @EnableAsync public class ThreadAsyncConfigurer implements AsyncConfigurer { @Value("${spring.task.execution.thread-name-prefix:thread_name_prefix_}") private

记一次线程池调优经历

安稳与你 提交于 2020-02-13 16:02:42
背景: 最近的一个项目需要用到招标,临时加了给我们的系统增加了一个性能需求,多少呢? 一秒钟300次NTP(不知道ntp的同学可以百度一下),平均3ms一次啊,没测试过,心里没有底。(⊙o⊙)… 情境介绍: 系统是一个时间服务器系统,客户端就是window系统,或者其他的一些服务器,来向时间服务器同步时间。 默认的window会向这个time.winodows.com进行时间同步,当然你也可以换成其他时间同步服务器。 划重点了:服务端NTP接口采用的是netty框架写的一个接口,netty想必大家都了解的吧,nio通信,性能超好的。 测试代码是使用Executors. newFixedThreadPool写的客户端,10个线程数发送ntp包 第一次测试 数据库连连接池最大设置为40个,测试结果俩一秒钟28次,是的你没有看错,连十分之一都没有,怎么这么差劲啊 达不到预期啊,不行啊,这不就达不到要求的了吗,得改啊,哪里改啊,怎么改啊? 回到代码中去,顺藤摸瓜找到具体业务类,就是继承SimpleChannelInboundHandler的类,从头到尾打量了一下业务代码,发现业务主要是构造返回消息,记录日志。 构造返回就是Java里的构造对象什么的,根本不耗时的。                    那就想不是有记录日志吗,不往数据库里面写东西了,把它注释掉,跑一遍试试看。 第二遍测试

爬天极网韩天任进程池.py

淺唱寂寞╮ 提交于 2020-01-18 18:49:21
import osimport requests# 导入进程:from multiprocessing import Poolfrom bs4 import BeautifulSoup# 定义下载图片功能:def download_img(url, dirname=""): res = requests.request("get", url) filename = url.split("/")[-1] with open(dirname + "/" + filename, "wb") as f: f.write(res.content) print(f"{dirname}{filename}下载成功!")# 定义找到大图片:def find_big_img(url): res = requests.request("get", url) bs = BeautifulSoup(res.content, "html.parser") div_obj = bs.find(name="div", attrs={"class": "l_effect_img_mid"}) img = div_obj.find("img") # print(img,"u") current_img_url = img.get("src") return current_img_urldef get_page

golang_Pool: go实现协程池

会有一股神秘感。 提交于 2019-12-05 01:52:10
初始化一个 Goroutine Pool 池,这个Pool维护了一个类似栈的FILO队列 ,里面存放负责处理任务的Worker,然后每有一个请求就开启一个协程。 之后 检查当前Worker队列中是否有空闲的Worker,如果有,取出执行当前的task; 没有空闲Worker,判断当前在运行的Worker是否已超过该Pool的容量,是 — 阻塞等待直至有Worker被放回Pool;否 — 新开一个Worker(goroutine)处理; 每个Worker执行完任务之后,放回Pool的队列中等待。 参考资料:《Go语言实战》7.2章 Pool package main import ( "io" "log" "sync" "errors" ) // Pool管理一组可以安全在多个goroutine间共享的资源 // 被管理的资源必须实现io.Closer接口 type Pool struct { m sync . Mutex resources chan io . Closer factory func ( ) ( io . Closer , error ) closed bool } // ErrPoolClosed表示请求了一个已经关闭的池 var ErrPoolClosed = errors . New ( "Pool has been closed." ) /

如何使用好线程池?

匿名 (未验证) 提交于 2019-12-02 23:03:14
如何使用好线程池? 线程个数大小的设置 线程池相关参数的配置 利用Hook嵌入你的行为 线程池的关闭 线程池数量的设置,你的依据是什么? 计算机密集型 应用需要非常多的CPU计算资源,避免过多的线程上下文切换 线程数 = CPU核数+1,已可以设置为CPU核数*2,还要看JDK的版本以及CPU配置(服务器的CPU有超线程) IO密集型 Web应用,涉及到大量的网络传输,不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束后,数据准备好后,线程才会继续执行。对于IO密集型的应用,我们可以多设置线程池中线程的数量,这样就能让等待IO的这段时间内,线程可以去做其它事,提高并发处理效率。线程上下文切换数有代价的 线程数 = CPU核数/(1-阻塞系数) 这个阻塞系数一般为0.8~0.9之间。 套用公司:对于双核CPU来说,比较理想的线程数就是20,当然这不是绝对的,需要根据实际情况以及实际业务来调整:final int poolSIze = (int)(copCore/(1-0.9)) 线程池相关参数如何配置? 高压线: 我们使用线程池的时候都不要选择没有上限限制的配置项 第一 我们不要去使用没有上限的线程池和设置无界队列! 比如,newCachedThreadPool的设置与无界队列因为某些不可预期的情况,线程池会出现系统异常

记录一次线程池的在项目中的实际应用,讲解一下线程池的配置和参数理解。

匿名 (未验证) 提交于 2019-12-02 21:53:52
前言:最近项目中与融360项目中接口对接,有反馈接口(也就是我们接收到请求,需要立即响应,并且还要有一个接口推送给他们其他计算结果),推送过程耗时、或者说两个接口不能是同时返回,有先后顺序。 这时我想到了把自己Controller立即返回接受成功,中间添加一个新的线程去做其他耗时的操作(线程池配置和参数测试讲解请阅读第5步)。 1、Controller代码如下: @Autowiredprivate CallThreadDemo worker; @RequestMapping("/bandBankConfirm2") public void bandBankConfirm2(String jsonString) { System.out.println("controller开始--------------");    //这里是需要调用第三方的接口传入参数 String method = "is.api.v3.order.bindcardfeedback"; Map<String, Object> map = new HashMap<>(); map.put("order_no", "254986512848973"); map.put("bind_status", 1); map.put("reason", "");     //这里开始调用线程池的方法 worker

java中线程池参数设置

半城伤御伤魂 提交于 2019-12-02 19:52:21
本文主要介绍线程池是解决了哪些问题以及线程池中 的corePoolSize(核心线程数),queueCapacity(等待队列的长度),maximumPoolSize(最大核心线程数)。本文不会对线程池各个参数介绍,假定你已经了解了线程池各个参数的含义。 1 为什么要有线程池呢? 当前实际应用中,经常会遇到单个请求处理时间短但请求量巨大但问题,简单说就是qps很高,平响时间很短的情况。这些情况下如果采用来一个任务就新建一个线程处理,那么会有什么问题呢? 1、每个任务新建一个线程,qps越高,就越消耗cpu资源新建线程;平响很短也需要cpu不断的销毁线程。从而会大量消耗cpu资源 2、创建的线程越多,cpu在处理任务时,线程切换相对更加频繁。导致cpu浪费在线程切换上的时间就会变长,从而会增加平响时间。 3、每个线程的创建都是要消耗内存资源的。高qps情况下容易出现OOM(unable to create new native Thread) 4、操作系统本身也不允许线程无限对增长 基于以上4个问题,线程池应运而生。 线程池中核心线程数能够重复使用,应对高qps无须频繁新建线程,进而减少线程之间切换的耗时;阻塞队列能够暂时缓存新到任务,作为新建线程的缓冲池。 2 线程池核心参数的计算 先列出计算公式,然后举例解释说明 2.1 核心线程数 corePoolSize=20% *

java中线程池的几种实现方式

谁说我不能喝 提交于 2019-12-02 17:55:52
1、线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 一个线程池包括以下四个基本组成部分: 1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务; 2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务; 3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等; 4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。 线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。 线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目,看一个例子: 假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。在线程池中,线程数一般是固定的

队列:队列在线程池等有限资源池中的应用

三世轮回 提交于 2019-11-27 16:01:34
1.理解队列? 典型队列,先进者先出的结构,是一种操作受限的线性数据结构。 队列类似栈,基本操作也有两个,入列(尾部插入数据)和出列(头部取出数据) 2.实现队列的方式 类似栈,也可以使用数组和链表来实现队列, 顺序队列:使用数组来实现队列 // 用数组实现的队列 public class ArrayQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head 表示队头下标,tail 表示队尾下标 private int head = 0; private int tail = 0; // 申请一个大小为 capacity 的数组 public ArrayQueue(int capacity) { items = new String[capacity]; n = capacity; } // 入队 public boolean enqueue(String item) { // 如果 tail == n 表示队列已经满了 if (tail == n) return false; items[tail] = item; ++tail; return true; } // 出队 public String dequeue() { // 如果 head == tail 表示队列为空 if

队列:队列在线程池等有限资源池中的应用

陌路散爱 提交于 2019-11-27 15:49:03
1.理解队列? 典型队列,先进者先出的结构,是一种操作受限的线性数据结构。 队列类似栈,基本操作也有两个,入列(尾部插入数据)和出列(头部取出数据) 2.实现队列的方式 类似栈,也可以使用数组和链表来实现队列, 顺序队列:使用数组来实现队列 // 用数组实现的队列 public class ArrayQueue { // 数组:items,数组大小:n private String[] items; private int n = 0; // head 表示队头下标,tail 表示队尾下标 private int head = 0; private int tail = 0; // 申请一个大小为 capacity 的数组 public ArrayQueue(int capacity) { items = new String[capacity]; n = capacity; } // 入队 public boolean enqueue(String item) { // 如果 tail == n 表示队列已经满了 if (tail == n) return false; items[tail] = item; ++tail; return true; } // 出队 public String dequeue() { // 如果 head == tail 表示队列为空 if