腾讯云
开发者社区
文档
建议反馈
控制台
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
物流IT圈
专栏成员
举报
280
文章
541103
阅读量
99
订阅数
订阅专栏
申请加入专栏
全部文章(280)
微服务(41)
数据库(35)
sql(34)
编程算法(32)
api(23)
电商(18)
企业(18)
分布式(18)
it(14)
大数据(12)
java(11)
物联网(11)
费用中心(10)
网站(10)
http(9)
缓存(9)
运维(8)
云数据库 SQL Server(7)
云数据库 Redis(7)
打包(7)
存储(7)
开源(7)
网络安全(7)
数据分析(7)
spring(6)
https(6)
系统架构(6)
供应链(6)
神经网络(5)
容器(5)
erp(5)
rpc(5)
数据挖掘(4)
机器学习(4)
nosql(4)
github(4)
深度学习(4)
消息队列 CMQ 版(4)
腾讯云测试服务(4)
uml(4)
安全(4)
机器人(4)
架构设计(4)
产品(4)
产品经理(4)
管理(4)
系统(4)
其他(3)
硬件开发(3)
git(3)
apache(3)
nginx(3)
文件存储(3)
devops(3)
压力测试(3)
jvm(3)
sql server(3)
微信(3)
数据可视化(3)
信息流(3)
云计算(3)
kafka(3)
app(3)
excel(3)
系统设计(3)
需求分析(3)
php(2)
python(2)
javascript(2)
go(2)
html(2)
嵌入式(2)
mvc(2)
jar(2)
搜索引擎(2)
linux(2)
unix(2)
访问管理(2)
短信(2)
图像处理(2)
金融(2)
数据安全(2)
工业物联(2)
serverless(2)
数据迁移(2)
hadoop(2)
mybatis(2)
tcp/ip(2)
socket编程(2)
windows(2)
5g(2)
验证码(2)
数据集成(2)
gsp(2)
产品设计(2)
软件(2)
负载均衡(1)
人脸识别(1)
比特币(1)
数字货币(1)
自动驾驶(1)
tensorflow(1)
ios(1)
xcode(1)
c 语言(1)
bash(1)
servlet(1)
vue.js(1)
react(1)
node.js(1)
xml(1)
css(1)
jquery(1)
json(1)
单片机(1)
symfony(1)
oracle(1)
access(1)
flask(1)
sqlalchemy(1)
ide(1)
lucene/solr(1)
负载均衡缓存(1)
apt-get(1)
tornado(1)
laravel(1)
批量计算(1)
云直播(1)
短视频(1)
API 网关(1)
SSL 证书(1)
数据加密服务(1)
物联网通信(1)
mongodb(1)
人工智能(1)
微服务与微计算(1)
日志数据(1)
智慧物流(1)
codeigniter(1)
自动化(1)
黑客(1)
爬虫(1)
spark(1)
无人驾驶(1)
hive(1)
面向对象编程(1)
spring boot(1)
推荐系统(1)
seo(1)
自动化测试(1)
cdn(1)
aop(1)
dubbo(1)
spring cloud(1)
数据处理(1)
数据结构(1)
hbase(1)
腾讯云开发者社区(1)
任务调度(1)
虚拟化(1)
mvcc(1)
utf8(1)
测试策略(1)
es(1)
数据库管理(1)
应用安全开发(1)
Elasticsearch Service(1)
智能推荐平台(1)
项目管理(1)
adapter(1)
axure(1)
bug(1)
dashboard(1)
ddd(1)
device(1)
frequency(1)
host(1)
layer(1)
ps(1)
saas(1)
sap(1)
sh(1)
usb(1)
表单(1)
产品运营(1)
工作(1)
基础(1)
监控(1)
解决方案(1)
开发(1)
连接(1)
模型(1)
配置(1)
设计(1)
数据(1)
算法(1)
同步(1)
效率(1)
异常(1)
异常处理(1)
原型(1)
搜索文章
搜索
搜索
关闭
多线程让可扩展性走进了死胡同
编程算法
rpc
tornado
网站
这是一篇来自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代替线程
物流IT圈
2019-07-16
834
0
没有更多了
社区活动
【纪录片】中国数据库前世今生
穿越半个世纪,探寻中国数据库50年的发展历程
立即查看
Python精品学习库
代码在线跑,知识轻松学
立即查看
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
立即体验
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
立即查看
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档