多线程让可扩展性走进了死胡同

[JVM]Java工程师要懂的硬件知识-前言 Mechanical Sympathy这个短语描述了一种车手对汽车天生的感觉,也是Martin Thompson大牛的博客标题。从并发编程网Disruptor的介绍中注意到这个短语,再去品位Martin对它的简短阐述’Hardware and software working together in harmony’的确很有道理。在对任何语言的深入学习研究中,总逃不过对底层硬件的了解与学习,很多语言 阅读详情

原文 http://www.jdon.com/46672

这是一篇来自Python世界的文章,但是对整个编程领域还是适用的,多线程虽然让我们处理请求更快,但是也是有天花板的,绿色(微线程micro-thread)线程之类才是解决方案。

多线程软件开发解决了大量的问题,尤其是以网络为中心的应用程序,这些程序需要严苛的性能快速响应用户。不幸的是,多线程并不足以解决大规模并发性的问题。

解决这些问题需要改变编程模型,使用异步事件和基于回调机制。在Druva,我们创建了一个基于python库的名为Dhaga来解决大规模并发,而编程模型不需要重大改变。

软件开发人员生活在一个并发的世界。线程如今是一等公民,今天在开发过程中,特别是当您的应用程序执行密集的网络运营,如同Druva一样的inSync系统(网络安全同步产品)。多线程帮助网络操作的编程代码流变得简单和顺序。当我们的应用程序需要增强的性能或改善其可伸缩性,我们可以增加线程的数量。

但是当需要成千上万规模的并发请求,线程是不够的。

我们发现多线程使用有以下缺点:
1. inSync系统客户端需要大量的文件通过网络RPC调用备份到服务器。开发人员加快速度的典型方法是使用线程。但多线程带来的性能却增加内存和CPU的使用成本;开发人员需要在速度和线程数之间保持一个平衡。

2.我们的服务器需要处理inSync系统与成千上万的客户之间并发连接和通知。为了有效地处理连接,我们使用线程来处理请求。但inSync系统客户的不断增加也意味着我们不得不继续增加线程的数量,从而消耗大量服务器的内存和CPU。

3.我们的Web服务器需要处理成千上万的平行的HTTP请求。大部分工作是在接收和发送的数据网络套接字并将其传给inSync系统的后端。导致大多数的线程等待网络操作。导致C10K问题,当有成千上万的同步请求到Web服务器,为每个请求生成一个线程是相当不可扩展的(Scale)。

异步框架的限制
许多异步框架,包括 Twisted扭曲、Tornado龙卷风和asyncore可以帮助开发人员远离使用线程的流行的方式。这些框架依赖非阻塞套接字和回调机制(类似Node.js)。如果我们按原样使用这些框架,我们Druva代码的主要部分必须重构。这不是我们想要做的事。重构代码会增加开发和测试周期,从而阻止我们达到规模要求。鉴于产品的多个部分需要大规模,我们每个人将不得不重构他们——因此增加一倍或两倍的努力。

为了避免改变如此多的代码,我们不得不离开直接使用现有的框架。幸运的是,我们发现一些有用的工具。

因为我们想要控制在网络I / O的代码执行,我们需要一种将一个线程划分为微线程micro-thread的方法。我们发现greenlets。它提供一种非隐式的微线程调度,称为co-routine协程。换句话说。当你想控制你的代码运行时它非常有用。您可以构建自定义计划的微线程,因为你可以控制greenlets什么时候yield暂停。这对我们来说是完美的,因为它给了我们完全控制我们的代码的调度。

Tornado是一个用Python编写的简单的、非阻塞的Web服务器框架,旨在处理成千上万的异步请求。我们使用它的核心组件,IOLoop IOStream。IOLoop是一个非阻塞套接字I / O事件循环;它使用epoll(在Linux上)或队列(BSD和Mac OS X),如果他们是可用的,否则选择()(在Windows上)。IOStream提供方便包装等非阻塞套接字读和写。我们委托所有套接字操作给Tornado,然后使用回调触发代码操作完成(banq注:非常类似Node.js机制)。

这是一个好的开始,但我们需要更多。如果我们在我们的代码中直接用上面的模块,我们大量的RPC代码将不得不改变,通过greenlets调度RPC,确保greenlets不要阻塞(如果greenlets堵塞,它会堵塞整个线程和其他全部),处理来自tornado的回调功能。

我们需要一个抽象来管理和安排greenlets 以避免让它被外部调用堵塞,这个抽象能够超越线程达到大规模可扩展。这个抽象是Dhaga,它能让应用代码流编程起来像传统同步顺序,但是执行是异步的。

Dhaga(来自印地语,这意味着线程)是我们抽象的一个轻量级线程的执行框架。Dhaga类是来源于greenlet,使用堆栈切换在一个操作系统线程中执行多个代码流。一个操作系统的线程中使用协作调度执行多个dhagas。每当一段dhaga等待时(主要是等待一个RPC调用返回),它yield控制权给父一级(也就是说,是创建它的操作系统级别线程的执行上下文)。然后父一级会调度安排的另一个dhaga准备运行。RPC调用将传递给tornado web服务器异步写入Socket,然后在其返回时注册一个回调,当这个RPC返回时,正在等待的dhaga将被添加到可运行队列中,然后后被父线程拾起。(banq注:类似node.js原理)

我们可以使用Dhaga代替线程处理高延迟操作,当为了吞吐量线程数量增加超过合理的限度时,我们在单个线程中使用512个dhaga。

使用dhaga测试结果:




[该贴被banq于2014-09-12 09:34修改过]



构建企业级AI Agent:架构设计、安全性与可扩展性 随着大语言模型(LLM)技术的飞速迭代,单Agent工具调用已无法满足金融风控、供应链调度、企业知识问答等高复杂度、强合规性的企业场景需求——企业级AI Agent不仅需要“像人一样思考和行动”,更要具备多人级协作能力坚不可摧的安全屏障百万级并发下的稳定表现可溯源的决策链路以及无代码/低代码的运维扩展性。本文将以“企业报销审核多智能体系统”为贯穿全文的案例,从一步步思考(STEP BY STEP REASONING) 阅读详情

相关推荐

《向量数据库指南》——Mlivus Cloud:重塑向量数据库的性能与可扩展性新标杆

当然,如果你想要更深入地了解向量数据库的原理和实现方法,以及Mlivus Cloud的更多细节和技巧,那么《向量数据库指南》绝对是你的不二之选。《向量数据库指南》作为行业内的畅销书,不仅系统地介绍了向量数据库的基本概念、发展历程,还深入剖析了各类向量数据库的优缺点,为读者提供了宝贵的选型建议。作为大禹智库的向量数据库高级研究员,同时也是《向量数据库指南》的作者,我深感有责任为大家深入剖析这款卓越的向量数据库,带领大家一同探索其背后的奥秘。在向量数据库中,性能是衡量其优劣的关键指标之一。

实战AI智能体 378

程序员的“机械同感”

偶然在Martin Flower的博客上看到了一篇讲述LMAX架构的博文,里面有一小块提到了“机械同感”Mechanical Sympathy(不知道该怎么翻译好)。恰逢最近正在看第二版的CSAPP(Computer System: A Programmer Perspective,深入理解计算机系统),感慨万千!“机械同感”(mechanical sympathy)来自于赛车比赛,它反映了车...

weixin_30855099的博客 222

基于Qt、OpenCV与OpenALPR的智能车牌识别停车场管理系统实战

OpenALPR 对中国车牌的支持其实并不完美,默认识别率可能只有 70% 左右。但我们可以通过修改配置文件大幅提升准确率。重点是中的pattern参数:pattern = [京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]{1}[A-Z]{1}([A-HJ-NP-Z0-9]{5}|[DF][A-HJ-NP-Z0-9]{6})这个正则表达式涵盖了普通蓝牌和新能源绿牌的所有合法组合。此外,还可以替换 Tesseract 的。

weixin_33245447的博客 920

伪共享---cache line 填充

我们经常提到一个短语Mechanical Sympathy,这个短语也是Martin博客的标题(译注:Martin Thompson),Mechanical Sympathy讲的是底层硬件是如何运作的,以及与其协作而非相悖的编程方式。(注解:sympathy这里是共鸣、一致的含义) 我在上一篇文章中提到RingBuffer后,我们收到一些关于RingBuffer中填充高速缓存行的评论和疑问。

kappen123的专栏 2612

MicroThread-开源

MicroThread是用于DOS程序的最小的Borland / Turbo C多线程库。 它包含一个抢先式调度内核,该内核在DOS INT 8上调度线程,并支持信号量,关键节和线程间消息。

智能座舱架构与芯片- (9) 音频篇 上

从A2B收发器衍生出来的简化产品具备各种级别的功能,例如端点从节点(不支持TDM)、简化型主节点(支持较短的电缆和更少的从节点数量),以及简化型端点从节点(支持较短电缆和更少的PDM输入)。例如,AVB中的talker和listener是不同的设备,它们的参考时钟源可能并不相同。传统的车载收音机通过天线接收无线电信号,然后由调谐模块(Tuner)进行信号调谐,信道过滤,信道均衡,多路改善,信号解调等,转为数字信号后再交给DSP进行立体声解码,噪声抑制,弱信号处理,最后从车载音响系统进行播放。

joanna_xiao的博客 4904

Mechanical Sympathy 系列翻译 内存访问模型

重要的内存访问模型 在高性能的计算中,我们常说缓存失效(cache-miss)是一个算法中最大性能损失点。 近些年来,我们的处理器处理能力的增长速度已经大大超过了访问主内存的延迟的增长。 通过更宽的,多通道的总线,到主内存的带宽已经大大增加,但延迟并没有相应显著减少。 为了减少延迟,处理器采用愈加复杂的多层的高速缓存子系统。  在1994年的一篇论文“Hitting the memor...

iteye_17060的博客 453

芯片Tapeout前GDS Review | Calibre中如何切出gds中指定区域版图?

芯片Tapeout GDS Review 之Calibre中如何切出指定区域版图GDS

weixin_37584728的博客 1786

Java并发编程(Java Concurrency)(4) - 并发模型

摘要:这是翻译自一个大概30个小节的关于Java并发编程的入门级教程,原作者Jakob Jenkov,译者Zhenning Lang,转载请注明出处,thanks and have a good time here~~~(希望自己不要留坑)并发模型并发

小狼碎碎念的博客 2994

保姆级教程:用GROMACS的FEP方法计算小分子结合自由能(附完整mdp配置)

本文提供了一份详细的GROMACS自由能微扰(FEP)计算教程,涵盖从系统准备、参数配置到结果分析的全流程。通过具体案例演示如何计算小分子结合自由能,包括λ窗口设计、动力学参数优化及并行化执行技巧,帮助研究者克服FEP计算中的常见问题,获得可靠的自由能数据。

weixin_30598225的博客 352

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 232

探索高效网络通信:走进`SocketDemo`

探索高效网络通信:走进SocketDemo 在软件开发中,网络通信是不可或缺的一部分,尤其在如今互联网应用遍地开花的时代。今天,我们要向大家推荐一个开源项目——,这是一个基于Java的简单且直观的Socket编程示例。它旨在帮助开发者更好地理解和实现网络间的通信,无论你是初学者还是经验丰富的开发者,都能从中获益。 项目简介 SocketDemo是一个简化的TCP/IP通信框架,主要由服务器端和客户...

gitblog_00019的博客 434

16、树莓派Pico W:蓝牙与Wi-Fi应用指南

本文介绍了树莓派Pico W在蓝牙与Wi-Fi通信方面的应用,涵盖蓝牙配对原理、使用HC-06模块实现手机远程控制LED和传输内部温度,以及通过Wi-Fi进行网络连接、扫描和UDP协议下的设备控制。文章包含详细电路连接、代码实现与测试步骤,并提供拓展建议、常见问题解决方法及开发注意事项,帮助读者快速掌握基于Pico W的无线通信项目开发,适用于物联网入门与实践场景。

sun99的博客 289

走进 mTCP

mTCP是一款面向多核系统的用户态网络协议栈 内核态协议栈的缺陷 互联网的发展,使得用户对网络应用的性能需求越来越高。人们不断挖掘CPU处理能力加强,添加核的数量,但这并没有使得网络设备的吞吐率线性增加,其中一个原因是内核协议栈成为了限制网络性能提升的瓶颈。 互斥上锁引起的开销 互斥上锁是多核平台性能的第一杀手。现在的服务器端应用为了尽可能的实现高并发,通常都是采用多线程的方式监听客户端...

4209

# YOLOv11改进系列 | 引入仓库自研C3k2_EIEM模块,Sobel边缘分支增强检测细节表达

文章摘要: YOLOv11-seg改进中提出的C3k2_EIEM模块通过引入边缘信息增强机制,显著提升了模型对轮廓和纹理的感知能力。该模块在保持原有C3k2结构的基础上,创新性地结合了Sobel边缘检测分支与常规卷积分支的双路特征融合。核心改进包括:(1)固定Sobel算子提供稳定的梯度响应;(2)并行处理边缘与纹理特征;(3)通过1x1卷积实现特征融合。实验显示,改进后模型参数量增加14.16%,计算量提升12.5%,但显著增强了在复杂边界场景下的分割精度。这种设计特别适用于需要精细轮廓识别的任务,如商品

qq_44224801的博客 95

ChatGPT充值,银行卡被拒绝,图文教程

ChatGPT充值,银行卡被拒绝

weixin_46713695的博客 2万+

Java多线程创建及同步锁的理解

多线程顾名思义就是多个线程在程序中运行,就比如我们的虚拟机JVM,启动的时候不止启动一个线程,至少有一个是负责Java程序的执行还有一个是垃圾回收机制GC的线程。一个进程中至少有一个线程。

MYY的博客 1162

qiankun 主子应用部署教程(Nginx 小白版)

本地开发:不用 Nginx,直接localhost:端口即可。本地模拟线上:用hosts + Nginx + 自定义域名,效果和生产接近。线上部署主应用只要配置 history 模式子应用必须支持 CORS + history + 缓存能跑是因为默认 server 兜底,但推荐写真实域名。主应用 vs 子应用的 Nginx 配置区别为什么本地和线上表现不一样history 模式 + 跨域的最佳实践。

专注于前端开发与实战技巧,记录从零到一的学习与项目经验。分享 Vue3 / JavaScript / TypeScript / Flutter /Uniapp等前端技术,以及 性能优化、工程化、最佳实践。 998

带你走进Netty世界

Netty简介 Netty是一个高性能、高可扩展性的异步事件驱动的网络应用程序框架,它极大地简化了TCP和UDP客户端和服务器开发等网络编程。 Netty四个重要内容: Reactor线程模型:一种高性能的多线程程序设计思路 Netty中自己定义的Channel概念:增强版的通道概念 ChannelPineline职责链设计模式:事件处理机制 内存管理:增强的ByteBuf缓冲区 Netty整体...

qq_24045275的博客 302

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

走进 Realm 的世界

  来源:XcodeMen(郭杰)    链接:http://www.jianshu.com/p/0e248f000405   本文由我们团队的郭杰童鞋分享。     Realm是什么   Realm是由Y Combinator公司孵化出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。历经几年才打造出来,为了彻底解决性...

weixin_33980459的博客 156

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

测评 OrangePi KunPeng Pro走进高校

处理器:搭载华为鲲鹏920处理器,具有4核64位处理器+AI处理器。内存:支持DDR4内存,配备8GB或16GB可选,速率达到3200Mbps。存储:支持多种存储解决方案,包括SATA接口和M.2接口2280,可用于安装SSD硬盘还具备eMMC插槽、TF卡槽。扩展接口:提供PCIe x4插槽,可用于扩展显卡、网络卡等。网络:通常配备千兆以太网接口,支持高速网络连接。无线通信:包括Wi-Fi和蓝牙模块4.2,支持双频2.4G和5G无线网络连接。**有线通信:**1000Mbps以太网高速运转。

杨校的博客 2万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

掌握Java语言的多线程编程:了解如何使用Java的并发工具类,如ExecutorService和Future。

通过本次学习,我们了解了Java多线程编程的重要性和基本原理,掌握了ExecutorService和Future的使用方法,理解了Java的线程池机制和使用ThreadPoolExecutor优化多线程编程的方法。这就像是在江湖中不断修炼自己的武艺和心性,最终成为一个真正的武林高手的过程。线程池的优势在于它可以提高程序的性能和可扩展性,减少线程创建和销毁的开销,提高资源的利用率。这些参数需要根据具体的应用场景和硬件环境来配置。线程池可以提高程序的性能和可扩展性,减少线程创建和销毁的开销,提高资源的利用率。

一个平平无奇的博客,一个平平无奇的人,一个平平无奇的约定 451

淘宝带你走进——幽灵Crash迷踪案

闲鱼Flutter技术的基础设施已基本趋于稳定,就在我们准备松口气的时候,一个Crash却异军突起冲击着我们的稳定性防线!闲鱼技术火速成立侦探小组执行嫌犯侦查行动,经理重...

淘系技术 352

走进Java异步编程的世界:开启高效编程之旅

在现代应用程序中,尤其是处理大量并发请求时,传统的同步编程方式往往会导致性能瓶颈,降低响应速度。异步编程作为一种有效的解决方案,通过将任务的执行与结果的返回解耦,可以显著提高系统的吞吐量和响应性。

qq_17153885的博客 405

别再死记硬背了!用餐厅点餐的比喻,5分钟搞懂Reactor模式的三种模型

本文通过餐厅点餐的生动比喻,详细解析了Reactor模式的三种模型:单线程、多线程和主从Reactor。从街边奶茶店到米其林餐厅的不同运营模式,对应技术架构的选择与优化,帮助开发者轻松理解高并发设计核心。特别适合需要快速掌握Reactor模式应用场景的技术人员阅读。

weixin_42561040的博客 171
上一篇: Python多进程编程相关技术
下一篇: greenlet: Lightweight concurrent programming
offbye
offbye 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄24年 1309粉丝 252原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值