编程语言应用

首页 » 常识 » 常识 » 想让服务器跑得快,并不是换个编程语言那么
TUhjnbcbe - 2022/8/10 18:43:00

近来一个读者问我:程序君,我是一个屡次被你黑的phper,我想学一门新的言语,做效劳器开采,看你彷佛用过许多言语,能引荐一个么?最佳是开采效率高,援助并发,本能又好的。

看了这留言,程序君满脸黑线。真是委屈啊,我和你素昧平生,何来屡次黑你?我然则偶然戏弄一下PHP云尔,不敢黑任何一个phper,更不敢黑这「宇宙上最佳的言语」呢。:)

言反正传。引荐一个开采效率高,并行本能好的言语/框架做效劳器开采,这个题目有点太广泛了:nodejs,go,elixir(erlang/otp),clojure,tornado(python)…都不违抗开采效率高,并行本能好的前提。然则:想让效劳器跑得快,编程言语(及其假造机)自身果真能起决计性的影响么?

咱们看看最根基的webserver开采,终究,做互联网的,没人离得开webserver。但是,我想大部份所谓的web程序员,没几个懂webserver的。拜library/framework所赐,在他们看来,webserver便是十行代码搞定的玩意儿:

(nodejs的高逼格helloworld:写一个webserver)

library/framework是好东西,也许让你不要介意各类细节,大大低沉了开采的门坎。但入了门以后,成了闇练工种,最佳反过来详尽研讨一下被封装掉的那些细节,不然条理永恒停止在码工的程度。

Webserver和任何TCPserver相同,都是管教网络流量的,是以网络管教的效率便是webserver效率的关键。除此以外:

HTTPRequest报文的管教,特别是header的管教(一个高效的parser)

URLdispatch(一个高效的patternmatchingengine)

HTTPResponse的封装(一个高效的stringbuilder)

也是容不得半点粗心的效率杀手。咱们紧要看网络关联的,这个是最大头。

网络管教

首先须要琢磨的是运用甚么并发模子:threading?singleevent-loop?multipleevent-loop?

初期的webserver运用OS供应的thread/process(下列讲thread,并不辨别thread/process),一个connection,accept下来以后,就交给一个thread去管教,thread内部也许做大肆的blockingI/O,并发本能靠thread的数目来保证,这便是threading模子。在现实运用中,正常会预先创立(pre-fork)一个threadpool来反复哄骗余暇的thread,裁减thread创立/闭幕的系统斲丧。Apache便是榜样的threading模子。

Threading模子的益处是代码很直觉,切合咱们推敲题目处分题目的罕用形式。职掌系统会管教线程的调理,使其适应多核的场景。害处是每个request的管教都触及高低文切换(contextswitch),系统斲丧大,同时thread的内存耗损(memoryfootprint)不小,很难创立不计其数个thread来灵验的供应更多并发才能。

为了补偿threading模子的瑕玷,此刻大大都webserver采取的是eventdriven模子。许多人误认为eventloop是nodejs始创,现实light

1
查看完整版本: 想让服务器跑得快,并不是换个编程语言那么