Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >为web应用程序实现会话特定线程池的缺陷

为web应用程序实现会话特定线程池的缺陷
EN

Software Engineering用户
提问于 2019-10-08 08:32:20
回答 2查看 200关注 0票数 3

基本上,每次用户登录到应用程序(创建一个新的用户会话)时,都会有一个新的线程池,其中包含几个工作线程。

我过去使用过的几乎所有web应用程序都有固定数量的基于功能的线程池,但是当用户基础增加时,几乎总是会出现性能问题。

有了每个用户的专用线程池,他们将体验到更少的滞后,而不必担心在共享池中竞争工作线程。

我这样想错了吗?如果是的话,我在这里忽略了什么?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2019-10-08 08:50:06

当您查看当今最具有高度可伸缩性的web应用程序(或服务)时,问题在于确保没有足够的可用线程,而是确保整个系统能够处理服务端点所需的并发web连接。

并发请求/秒对一次安装的最大进步来自于非阻塞I/O --本质上,当一个新客户端连接时,以及当新字节到达时,操作系统具有允许应用程序的方法。只要系统完全支持非阻塞I/O,单个线程就可以处理数千个异步连接。

一个系统一次可以有太多的活动线程。当这种情况发生时,操作系统花费更多的时间在线程之间切换上下文,而不是在线程中执行工作。拥有一个具有有限线程数的全局线程池来使用异步平台处理异步I/O,将有助于提高每秒处理数千个请求的效率。最好让总线程数一个多个核心在您的机器上(跨越所有CPU)。

另一个非常常见的解决方案是简单地让更多的服务器承载您的应用程序或web服务。每个服务器都在自己的进程中,很多时候是在不同的硬件上。如果有一个合适的“无共享”体系结构,那么您可以在负载均衡器允许的范围内进行扩展。

票数 7
EN

Software Engineering用户

发布于 2019-10-08 12:50:14

要添加到Berin的答案:在应用程序中添加更多的线程,超过CPU数量(每个核心可以有多个CPU),只会在应用程序性能不受CPU限制的情况下提高性能。大多数web应用程序都是IO绑定的,这使得在这个空间中添加线程成为一个可行的策略。

但是,也存在线程切换开销:在某个时候,添加更多的线程会降低性能。你可能会感到惊讶的是,只有这么少的线程才能达到这一点。继续超越这个点,你最终会使系统瘫痪。结果是,您需要限制线程的总数。最有可能的原因是,您看到这与功能的划分是基于对这些不同活动的观察需求。如果对用户进行分配,则很难优化线程分配。您需要限制主机支持的用户数量。这可能对您的应用程序更好,也可能不会。

如果您想提高利用率,最好的选择是非阻塞IO (NIO),它允许一个线程在IO绑定的应用程序中处理多个用户请求。简而言之:它不再等待(阻塞) IO请求,而是继续执行任何可用的工作。它这样做并不会引起系统级线程切换的成本。其结果是,一个服务器可以支持的用户数量大大增加。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/399469

复制
相关文章
线程池:线程池的实现 | 日志
在一个可执行程序内部存在多个线程和一个任务队列。如果任务队列里长时间没有任务,这些线程就会休眠,如果此时来了一个任务,那么线程就会被唤醒。像这种,提前创建好线程,需要的时候直接使用,我们称之为线程池。这种本质上就是一个生产消费模型。
南桥
2024/10/02
890
线程池:线程池的实现 | 日志
Java 线程池的实现
        任务接口:每个任务必须实现的接口,主要用来规定任务的入口、任务执行完后的收尾工作、任务的执行状态等。 工作线程通过该接口调度任务的执行。
Rekent
2018/09/04
5040
线程池的实现原理
线程池(Thread Pool)是一种基于池化思想管理线程的工具,经常出现在多线程服务器中,如MySQL。线程过多会带来额外的开销,其中包括创建销毁线程的开销、调度线程的开销等等,同时也降低了计算机的整体性能。线程池维护多个线程,等待监督管理者分配可并发执行的任务。这种做法,一方面避免了处理任务时创建销毁线程开销的代价,另一方面避免了线程数量膨胀导致的过分调度问题,保证了对内核的充分利用。
Java架构师必看
2021/04/23
6220
【Linux/多线程】线程池的实现
线程池(Thread Pool)是一种线程管理机制,用于减少线程创建和销毁的开销,提高程序的并发性能。线程池在初始化时会创建一定数量的线程,这些线程可以重复执行多个任务,而不是为每个任务创建新的线程。
Yui_
2025/02/07
1420
【Linux/多线程】线程池的实现
创建线程池的七种方式为_全局线程池如何创建
在 Java 语言中,并发编程往往都是通过床架线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景。总结来说线程池的创建可以分为两大类:
全栈程序员站长
2022/11/10
8300
创建线程池的七种方式为_全局线程池如何创建
C++线程池实现_java线程池状态
在计算机程序中,线程是一种很重要的资源,使用的恰当可以极大的提高程序的效率,也就是多线程的使用,但是多线程会让应用程序变得异常复杂,会占用大量的系统资源。就像QQ表情一样,每一个QQ表情的闪动都需要构建一个线程,如果用户使用了大量的表情(GIF),将会有多少个线程在运行,系统的性能将大大减少,甚至导致死机。在这种情况下,多线程变得不太合适了,那么什么机制适用于这种情况下呢,这就是线程池。
全栈程序员站长
2022/11/08
7840
Golang实现线程池
package main import "fmt" import "time" //这个是工作线程,处理具体的业务逻辑,将jobs中的任务取出,处理后将处理结果放置在results中。 func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println("worker", id, "processing job", j) time.Sleep(time.Second) results <-
李海彬
2018/03/23
1.7K0
线程池实现原理
线程池创建线程时,会将线程封装成工作线程 Worker , Worker 在执行完任务后,还会循环获取工作队列里的任务来执行.我们可以从 Worker 类的 run()方法里看到这点。
kwan的解忧杂货铺
2024/08/13
740
轻量级线程池的实现
写在前面 最近因为项目需要,自己写了个单生产者-多消费者的消息队列模型。多线程真的不是等闲之辈能玩儿的,我花了两个小时进行设计与编码,却花了两天的时间调试与运行。在这里,我把我遇到的坑与大家分享。 需求的由来 一开始我需要实现一个记录用户操作日志的功能,目的是给商家用户提供客户行为分析的能力。要记录的信息包括客户的访问时间、IP、在网站上所做的操作等。其中,客户的地域信息是个重要的分析项,所以必须要把IP转化成省市县。那么究竟何时完成这个转化的动作呢?有两种方案: 1. 在用户进行数据分析时完成转化
大闲人柴毛毛
2018/03/09
1.1K0
轻量级线程池的实现
用 Python 实现的线程池
为了提高程序的效率,经常要用到多线程,尤其是IO等需要等待外部响应的部分。线程的创建、销毁和调度本身是有代价的,如果一个线程的任务相对简单,那这些时间和空间开销就不容忽视了,此时用线程池就是更好的选择,即创建一些线程然后反复利用它们,而不是在完成单个任务后就结束。
py3study
2020/01/14
6810
线程池的实现原理分析
在 Java 中,如果每个请求到达就创建一个新线程,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。如果在一个 Jvm 里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系
会说话的丶猫
2020/08/17
8230
Tomcat 的线程池实现原理
ThreadPoolExecutor回收不了,可以看看其源码,工作线程Worker是内部类,只要它活着,换句话说线程在跑,就会阻止ThreadPoolExecutor回收,所以其实ThreadPoolExecutor是无法回收的,并不能认为ThreadPoolExecutor没有引用就能回收
JavaEdge
2021/02/23
7910
线程池-线程池的好处
在线程的销毁时需要回收这些系统资源。频繁的创建和销毁线程会浪费大量的系统资源,增加并发编程的风险。
DougWang
2020/02/18
1.4K0
线程(四)线程池的实现+线程的单例模式
一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够 保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。
海盗船长
2020/08/27
1.2K0
线程池(1)——线程池的使用
概述 ---- 1.ThreadPoolExecutor 2.ForkJoinPool 3.ThreadPoolExecutor VS ForkJoinPool 第1节 ThreadPoolExecutor ---- ThreadPoolExecutor执行无返回值的任务。 public class ThreadTest { public static void main(String[] args) { /* 核心线程池的大小 */
黑洞代码
2021/01/14
2.9K0
线程池(1)——线程池的使用
Java线程池实现原理
ThreadPoolExecutor采取上述步骤的总体设计思路,是为了在执行execute()方法时,尽可能地避免获取全局锁(那将会是一个严重的可伸缩瓶颈)。在ThreadPoolExecutor完成预热之后(当前运行的线程数等于corePoolSize),几乎所有的execute()方法调用都是执行步骤2,而步骤2不需要获取全局锁。
luoxn28
2020/11/12
5640
线程池实现原理-1
这个看起来好像没有用到线程池,其实是因为没有可复用的线程,所以就一直创建新的线程了
Java识堂
2019/08/13
7030
Golang语言 实现线程池
1 type GoroutinePool struct { 2 Queue chan func() error 3 Number int 4 Total int 5 6 result chan error 7 finishCallback func() 8 } 9 10 // 初始化 11 func (self *GoroutinePool) Init(number int, total int) { 12 self.Q
李海彬
2018/03/26
2.6K0
线程池实现与讲解
线程池,好东西啊,它有一池子的线程,所以叫线程池。 为什么说它是好东西呢?有的人会觉得,那一池子线程,放在那边又不用,不浪费资源? 其实这笔账很好算的:假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 当 T1+T3 > T2 && 这种线程被多次调度的时候,你还会觉得浪费资源吗?况且线程池内部又不是缺乏管理,相反,线程池内部管理很严格,吃白饭的线程很难有立足之地,用不上就裁员呗。
看、未来
2022/05/06
2760
手写线程池,对照学习ThreadPoolExecutor线程池实现原理!
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki
huofo
2022/03/18
3850
手写线程池,对照学习ThreadPoolExecutor线程池实现原理!

相似问题

如何在后端web应用程序中实现会话状态?

10

线程池的类比

30

什么是线程池?

30

并行执行:一个线程池还是N个线程池?

10

生产用户线程池

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档