網(wǎng)絡(luò)編程中的并發(fā)與異步

之前有用到socket編程中的select函數(shù)實(shí)現(xiàn)異步榜跌,現(xiàn)在要寫一個(gè)raw socket 來(lái)實(shí)現(xiàn)本地流量監(jiān)控,同時(shí)記錄ICMP盅粪,TCP,UDP流量悄蕾,遇到起線程的問(wèn)題票顾,所以就有了想法,都是實(shí)現(xiàn)異步帆调,select函數(shù)和起線程有什么區(qū)別奠骄,當(dāng)前流行的服務(wù)器解決方案是什么。

答案:

  1. select函數(shù)(poll番刊,epoll類似)本質(zhì)不是異步含鳞,只是實(shí)現(xiàn)非阻塞的方法。
  2. 當(dāng)前流行的解決方案是:event loop + thread pool芹务,就是事件輪循加線程池的做法蝉绷。

select 函數(shù)本質(zhì)不是異步

我在之前寫的文章socket編程的幾個(gè)問(wèn)題中提到過(guò)select函數(shù)鸭廷,它可以監(jiān)控接收或發(fā)送事件的情況,若需要接收或發(fā)送熔吗,就進(jìn)行處理辆床,如果出現(xiàn)錯(cuò)誤或者沒(méi)有需要處理的事件就跳出執(zhí)行之后的事件,不必一直等待桅狠。而傳統(tǒng)的阻塞模式會(huì)一直等待事件發(fā)生才返回讼载。

這是實(shí)現(xiàn)非阻塞的方法,但是本質(zhì)上它是一個(gè)同步的函數(shù)中跌,是同步執(zhí)行的咨堤。換句話說(shuō),它實(shí)現(xiàn)的功能本身和異步?jīng)]有關(guān)系漩符,但是可以異步地執(zhí)行select函數(shù)一喘。
參考1
參考2

事件輪循加線程池

首先,了解一下線程池的概念陨仅。線程池津滞,字面理解,就是一個(gè)放了很多線程的地方灼伤,我們把它叫做線程池触徐,我們需要了解的是為什么需要用到它。

假設(shè)一個(gè)服務(wù)器完成一項(xiàng)任務(wù)所需時(shí)間為:T1 創(chuàng)建線程時(shí)間狐赡, T2 在線程中執(zhí)行 任務(wù)的時(shí)間撞鹉,T3 銷毀線程時(shí)間。
如果:T1 + T3 遠(yuǎn)大于 T2颖侄,則可以采用線程池鸟雏,以提高服務(wù)器性能。

參考3

也就是說(shuō)览祖,采用線程池是為了免去創(chuàng)建線程和銷毀線程的時(shí)間孝鹊,我們循環(huán)利用線程池的線程,而不需要每一個(gè)連接對(duì)應(yīng)一個(gè)線程展蒂,這樣會(huì)大大減少創(chuàng)建和銷毀線程的個(gè)數(shù)又活。舉個(gè)栗子:

假設(shè)一個(gè)服務(wù)器一天要處理50000個(gè)請(qǐng)求,并且每個(gè)請(qǐng)求需要一個(gè)單獨(dú)的線程完成锰悼。在線程池中柳骄,線程數(shù)一般是固定的,所以產(chǎn)生線程總數(shù)不會(huì)超過(guò)線程池中線程的數(shù)目箕般,而如果服務(wù)器不利用線程池來(lái)處理這些請(qǐng)求則線程總數(shù)為50000耐薯。一般線程池大小是遠(yuǎn)小于50000。所以利用線程池的服務(wù)器程序不會(huì)為了創(chuàng)建50000而在處理請(qǐng)求時(shí)浪費(fèi)時(shí)間,從而提高效率曲初。

那么具體事件輪循加線程池的怎么做体谒。

先用select接口(poll/epoll,kq,iocp)接受請(qǐng)求,這樣可以保證并發(fā)复斥,在這個(gè)環(huán)節(jié)他只管收营密,不處理業(yè)務(wù),把FD放到一個(gè)buffer(一個(gè)q里面)目锭,然后業(yè)務(wù)處理模型對(duì)接線程池评汰。可以使復(fù)雜業(yè)務(wù)處理上的負(fù)擔(dān)被分擔(dān)痢虹。select+線程池被去,這樣兼顧了并發(fā)(犧牲了一點(diǎn)性能),又保證了因?yàn)檫壿嫶a的簡(jiǎn)潔性奖唯。

參考4 羅然的回答

也就是說(shuō)惨缆,我select函數(shù)負(fù)責(zé)接收判斷請(qǐng)求狀態(tài)(即判斷有沒(méi)有可讀或者可寫的套接字,有的話加入到數(shù)組中)丰捷,而內(nèi)部的處理接收或發(fā)送信息的過(guò)程交給線程池來(lái)做坯墨。

總結(jié)

多線程,異步這些概念總是含含糊糊病往,真真假假地在腦海里閃現(xiàn)捣染,一會(huì)覺(jué)得理解了,暗自慶幸停巷,一會(huì)又想不通耍攘,糾結(jié)萬(wàn)分。有時(shí)候不必太過(guò)鉆牛角尖畔勤,這些概念不過(guò)人取的名字蕾各,其實(shí)并不像看上去那樣分得那么開(kāi)或是靠得那么緊∏炀荆可能是某一個(gè)上古程序員想實(shí)現(xiàn)一邊看電影一邊聽(tīng)音樂(lè)式曲,實(shí)現(xiàn)的這個(gè)目的呢,起個(gè)名字缸榛,叫異步吧检访,怎么解決呢,想了個(gè)辦法仔掸,用多線程吧,囔医清,起了個(gè)名字起暮,多線程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市负懦,隨后出現(xiàn)的幾起案子筒捺,更是在濱河造成了極大的恐慌,老刑警劉巖纸厉,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件系吭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡颗品,警方通過(guò)查閱死者的電腦和手機(jī)肯尺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)躯枢,“玉大人则吟,你說(shuō)我怎么就攤上這事〕澹” “怎么了氓仲?”我有些...
    開(kāi)封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)得糜。 經(jīng)常有香客問(wèn)我敬扛,道長(zhǎng),這世上最難降的妖魔是什么朝抖? 我笑而不...
    開(kāi)封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任啥箭,我火速辦了婚禮,結(jié)果婚禮上槽棍,老公的妹妹穿的比我還像新娘捉蚤。我一直安慰自己,他們只是感情好炼七,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布缆巧。 她就那樣靜靜地躺著,像睡著了一般豌拙。 火紅的嫁衣襯著肌膚如雪陕悬。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天按傅,我揣著相機(jī)與錄音捉超,去河邊找鬼。 笑死唯绍,一個(gè)胖子當(dāng)著我的面吹牛拼岳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播况芒,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惜纸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耐版,我...
    開(kāi)封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祠够,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后粪牲,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體古瓤,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年腺阳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了落君。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舌狗,死狀恐怖叽奥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痛侍,我是刑警寧澤朝氓,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站主届,受9級(jí)特大地震影響赵哲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜君丁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一枫夺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绘闷,春花似錦橡庞、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至华嘹,卻和暖如春吧趣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耙厚。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工强挫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薛躬。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓俯渤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親型宝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子稠诲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容