【线程池】面试被问到线程池参数如何配置时该如何回答

       前言

        没有基于业务场景,直接抛出这个问题,等同于耍流氓。

        八股文告诉我们CPU密集型就核心数+1,IO密集型就核心数*2,那么真实业务中该怎么去配置呢。

        方法论还是有的

        1.需要分析线程池执行的任务的特性: CPU 密集型还是 IO 密集型
        2.每个任务执行的平均时长大概是多少,这个任务的执行时长可能还跟任务处理逻辑是否涉及到网络传输以及底层系统资源依赖有关系
        如果是 CPU 密集型,主要是执行计算任务,响应时间很快,cpu 一直在运行,这种任务 cpu的利用率很高,那么线程数的配置应该根据 CPU 核心数来决定,CPU 核心数=最大同时执行线程数,加入 CPU 核心数为 4,那么服务器最多能同时执行 4 个线程。过多的线程会导致上下文切换反而使得效率降低。那线程池的最大线程数可以配置为 cpu 核心数+1 如果是 IO 密集型,主要是进行 IO 操作,执行 IO 操作的时间较长,这是 cpu 出于空闲状态,导致 cpu 的利用率不高,这种情况下可以增加线程池的大小。这种情况下可以结合线程的等待时长来做判断,等待时间越高,那么线程数也相对越多。一般可以配置 cpu 核心数的 2 倍。
        一个公式:线程池设定最佳线程数目 = ((线程池设定的线程等待时间+线程 CPU 时间)/
线程 CPU 时间 )* CPU 数目
        这个公式的线程 cpu 时间是预估的程序单个线程在 cpu 上运行的时间(通常使用 loadrunner测试大量运行次数求出平均值)




        日常业务线程池的配置,项目中比比皆是,线程池的参数设置大多基于开发任务人员的经验,基于对项目的熟悉,基于对屎山了如执掌。

        假如啊一个新瓜蛋子刚来项目,接到要给业务人员发通知邮件,小同志很有想法,邮件嘛,异步发,搞个线程池,还不影响业务,咔咔一顿开发,参数就按照网上通用的来,IO密集型,核心线程数就CPU核心数*2吧。

        老油条一看你这可不太行,这邮件本身也不重要,你搞这么多线程数很容易影响核心业务,

随手就从屎山的角落掏出一堆线程池告诉你,现在这个屎山可不稳定,回头项目上线一爆炸,很容易大家都一身屎,天天开发shift也不用按了,先把shit清了再说。

        像这种边缘业务场景,核心线程数及最大线程数设置为1个就行了,队列大小嘛,按照现在业务量来说设置个1000个,满满的够了。

        基于业务场景设置线程池参数,开发人员必须对业务和项目足够深度的了解,很深的那种,至少要到业务一加需求,有底气摇头say no。

        但是,但是,但是,在复杂的业务场景下,我们总能找到一些规律,线程池这个不安分的炸弹也会被我们揪到一些蛛丝马迹。

        我举个例子。

例子一

        我们的职位详情页展示数据来源较多,涉及多方的业务,比如职位信息,企业信息,HR信息,还有风险提示等等

        职位详情页是我们兼职服务的一个核心业务功能点,如果串行处理,在业务高峰期很容易响应过慢。

        这个时候我们需要使用多线程的查询组装页面信息,线程池无疑是一个不二的选择。

        首先这是个IO密集型业务,没有复杂的计算逻辑,对于参数设置,开始我们配置核心线程数50,最大线程数都是100个,阻塞队列1000,拒绝策略执行后降级处理。

        核心线程数及最大线程数尽可能的大,防止详情页挂掉,正常请求耗时很少,线程数足够的话,业务高峰也不会有问题。

例子二

        我们有个内部的业务系统,核心业务是使用Excel模板导入大量数据,然后标准化存储后,推送给第三方使用。

        导入的业务数据需要层层清洗及计算,CPU密集型,这里我们线程池的配置就不能像上个例子那么配置了,选择较少的线程数,然后队列配置的大一些。

结语

        有些我认为标准化的线程池配置,我列举出来,大家来找茬

  1. 自定义线程池
  2. 不适用吴姐队列队列
  3. 选用合适的拒绝策略

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/102778.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Node.js】Node.js安装详细步骤和创建Express项目演示

Node.js是一个开源的、跨平台的JavaScript运行环境,用于在服务器端运行JavaScript代码。它提供了一个简单的API,可以用于开发各种网络和服务器应用程序。 以下是Node.js的安装和使用的详细步骤和代码示例: 1、下载Node.js 访问Node.js官方…

【Python小项目之Tkinter应用】随机点名/抽奖工具大优化:实现背景图与其他组件自适应窗口大小变化并保持相对位置和比例不变

文章目录 前言一、需求分析与实现思路明确需求实现思路二、关键代码2.1 实现背景图随着窗口大小变化而变化2.2 更换place的参数三、完整代码四、总结4.1 意外收获前言 话不多说,直接看优化后的效果: 优化前: 是不是非常的哇塞,相比于之前只能固定窗口大小来运行,优化后…

docker 安装rabbitmq

前提:安装好docker docker安装_Steven-Russell的博客-CSDN博客 centos7安装docker_centos7 docker 安装软件_Steven-Russell的博客-CSDN博客 1、启动docker systemctl start docker 2、下载镜像 // 可以先search查询一下可用镜像,此处直接下载最新版本…

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书

北京已收录2023开学了《乡村振兴战略下传统村落文化旅游设计》中国建筑出版传媒许少辉八一新书

QML实现文件十六进制数据展示

前言 将一个二进制文件直接拖放到Qt Creator中可以直接查看到以十六进制显示的数据格式,如: 要实现一个这样的效果,还是要花不少时间的。 在网上找了挺多示例,其中一个开源代码效果不错(参考这里)&#…

基于Python开发的飞机大战小游戏彩色版(源码+可执行程序exe文件+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python开发的飞机大战小游戏,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,…

区块链实验室(20) - FISCO控制台连接到指定的节点

在FISCO技术文档中,控制台默认采用config.toml作为配置文件,并指定了连接的节点地址和商品,如下所示。 [network] peers["127.0.0.1:20200", "127.0.0.1:20201"] # The peer list to connect在该案例中,控…

【基础计算机网络1】认识计算机网络体系结构,了解计算机网络的大致模型(下)

前言 在上一篇我们主要介绍了有关计算机网络概述的内容,下面这一篇我们将来介绍有关计算机网络体系结构与参考模型的内容。这一篇博客紧紧联系上一篇博客。 这一篇博客主要内容是:计算机网络体系结构与参考模型,主要是计算机网络分层结构、协…

光学显微镜算法(OMA)(含MATLAB代码)

先做一个声明:文章是由我的个人公众号中的推送直接复制粘贴而来,因此对智能优化算法感兴趣的朋友,可关注我的个人公众号:启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法,经典的,或者是近几年…

2023/9/7 -- C++/QT

作业 1> 思维导图 2> 封装一个结构体,结构体中包含一个私有数组,用来存放学生的成绩,包含一个私有变量,用来记录学生个数, 提供一个公有成员函数,void setNum(int num)用于设置学生个数 提供一个…

Python足球训练打卡系统SpringBoot足球场地预约系统源码 调试 lw

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等,大家有这一块的问题可以一起交流! 💕&…

MySQL的故事——MySQL架构与历史

MySQL架构与历史 文章目录 MySQL架构与历史一、MySQL逻辑架构二、并发控制三、事务四、多版本并发控制(MVCC) 一、MySQL逻辑架构 第一层:连接处理、授权认证、安全等等 第二层:查询解析、分析、优化、缓存以及所有的内置函数。包含跨存储引擎的功能&…