1. 程式人生 > >網路程式設計基礎【day10】:我是一個執行緒(四)

網路程式設計基礎【day10】:我是一個執行緒(四)

本節內容

1、第一回 初生牛犢

2、第二回 漸入佳境

3、第三回 虎口脫險

4、第四回 江湖再見

第一回 初生牛犢

我是一個執行緒,我一出生就被編了個號:0x3704,然後被領到一個昏暗的屋子裡,在這裡我發現了很多和我一模一樣的同伴。

我身邊的同伴0x6900 待的時間比較長,他帶著滄桑的口氣對我說:“我們執行緒的宿命就是處理包裹。把包裹處理完以後還得馬上回到這裡,否則可能永遠回不來了。”

我一臉懵懂,“包裹,什麼包裹?”

“不要著急,馬上你就會明白了,我們這裡是不養閒人的。”

果然,沒多久,屋子的門開了, 一個面貌凶惡的傢伙吼道:“0x3704 ,出來!”

我一出來就被塞了一個沉甸甸的包裹,上面還附帶著一個寫滿了操作步驟的紙。 

“快去,把這個包裹處理了。”

“去哪兒處理?”

“跟著指示走,先到就緒車間。”

果然,地上有指示箭頭,跟著它來到了一間明亮的大屋子,這裡已經有不少執行緒了,大家都很緊張,好像時刻準備著往前衝。

我剛一進來,就聽見廣播說:“0x3704,進入車間。”

我趕緊往前走,身後有很多人議論。

“他太幸運了,剛進入就緒狀態就能執行。”

“是不是有關係?”

“不是,你看人家的優先順序多高啊,唉!”

前邊就是車間,這裡簡直是太美了,怪不得老執行緒總是嘮叨著說:“要是能一直待在這裡就好了。”

這裡空間大,視野好,空氣清新,鳥語花香,還有很多從來沒見過的人,像服務員一樣等著為我服務。

他們也都有編號,更重要的是每個人還有個標籤,上面寫著:硬碟、資料庫、記憶體、網絡卡……

我現在理解不了,看看操作步驟吧。

第一步:從包裹中取出引數。

開啟包裹,裡邊有個HttpRequest物件,可以取到userName、 password兩個引數。

第二步:執行登入操作。

奧,原來是有人要登入啊,我把userName、password交給資料庫服務員,他拿著資料,慢騰騰地走了。

他怎麼這麼慢?不過我是不是正好可以在車間裡多待一會兒?反正也沒法執行第三步。

就在這時,車間裡的廣播響了:“0x3704,我是CPU,記住你正在執行的步驟,然後馬上帶著包裹離開!”

我慢騰騰地開始收拾。

“快點,別的執行緒馬上就要進來了。”

離開這個車間,又來到一個大屋子,這裡有很多執行緒在慢騰騰地喝茶,打牌。

“哥們,你們沒事幹了?”

“你新來的吧,你不知道我在等資料庫服務員給我資料啊!據說他們比我們慢好幾十萬倍,在這裡好好歇吧。”

“啊? 這麼慢!我這裡有人在登入系統,能等這麼長時間嗎?”

“放心,你沒聽說過人間一天,CPU一年嗎?我們這裡是用納秒、毫秒計時的,人間等待一秒,相當於我們好幾天呢,來得及。”

乾脆睡一會吧。不知道過了多久,大喇叭又開始廣播了:“0x3704,你的資料來了,快去執行!”

我轉身就往CPU車間跑,發現這裡的門只出不進!

後面傳來陣陣鬨笑聲:“果然是新人,不知道還得去就緒車間等。”

於是趕緊到就緒車間,這次沒有那麼好運了,等了好久才被再次叫進CPU車間。

在等待的時候,我聽見有人小聲議論:

“聽說了嗎,最近有個執行緒被kill掉了。”

“為啥啊?”

“這傢伙賴在CPU車間不走,把CPU利用率一直搞成100%,後來就被kill掉了。”

“Kill掉以後弄哪兒去了?”

“可能被垃圾回收了吧。”

我心裡打了個寒噤,趕緊接著處理,剩下的動作快多了,第二步登入成功。

第三步:構建登入成功後的主頁。

這一步有點費時,因為有很多HTML需要處理,不知道程式碼誰寫的,處理起來很煩人。

我正在緊張的製作HTML呢, CPU又開始叫了:

“0x3704,我是CPU ,記住你正在執行的步驟,然後馬上帶著包裹離開!”

“為啥啊?”

“每個執行緒只能在CPU上執行一段時間,到了時間就得讓別人用了,你去就緒車間待著,等著叫你吧。”

就這樣,我一直在“就緒——執行”這兩個狀態中不知道輪轉了多少次, 終於按照步驟清單把工作做完了。

最後順利地把包含html的包裹發了回去。至於登入以後幹什麼事兒,我就不管了。馬上就要回到我那昏暗的房間了,真有點捨不得這裡。不過相對於有些執行緒,我還是幸運的,他們執行完以後就被徹底地銷燬了,而我還活著!

回到了小黑屋,老執行緒0x6900問:

“怎麼樣?第一天有什麼感覺?”

“我們的世界規則很複雜,首先你不知道什麼時候會被挑中執行;第二,在執行的過程中隨時可能被打斷,讓出CPU車間;第三,一旦出現硬碟、資料庫這樣耗時的操作,也得讓出CPU去等待;第四,就是資料來了,你也不一定馬上執行,還得等著CPU挑選。”

“小夥子理解的不錯啊。”

“我不明白為什麼很多執行緒執行完任務就死了,為什麼咱們還活著?”

“你還不知道?長生不老是我們的特權!我們這裡有個正式的名稱,叫作執行緒池!”

第二回 漸入佳境

平淡的日子就這麼一天天地過去,作為一個執行緒,我每天的生活都是取包裹、處理包裹,然後回到我們昏暗的家:執行緒池。

有一天我回來的時候,聽到有個兄弟說,今天要好好休息下,明天就是最瘋狂的一天。我看了一眼日曆,明天是 11月11號。 

果然,零點剛過,不知道那些人類怎麼了,瘋狂地投遞包裹,為了應付蜂擁而至的海量包裹,執行緒池裡沒有一個人能閒下來,全部出去處理包裹,CPU車間利用率超高,硬碟在嗡嗡轉,網絡卡瘋狂的閃,即便如此,還是處理不完,堆積如山。

我們也沒有辦法,實在是太多太多了,這些包裹中大部分都是瀏覽頁面,下訂單,買、買、買。

不知道過了多久,包裹山終於慢慢地消失了。終於能夠喘口氣,我想我永遠都不會忘記這一天。

通過這個事件,我明白了我所處的世界:這是一個電子商務的網站!

我每天的工作就是處理使用者的登入,瀏覽,購物車,下單,付款。

我問執行緒池的元老0x6900:“我們要工作到什麼時候?”

“要一直等到系統重啟的那一刻。”0x6900說。

“那你經歷過系統重啟嗎?”

“怎麼可能?系統重啟就是我們的死亡時刻,也就是世界末日,一旦重啟,整個執行緒池全部銷燬,時間和空間全部消失,一切從頭再來。”

“那什麼時候會重啟?”

“這就不好說了,好好享受眼前的生活吧……”

其實生活還是豐富多彩的,我最喜歡的包裹是上傳圖片,由於網路慢,所以能在就緒車間、CPU車間待很長很長時間,可以認識很多好玩的執行緒。

比如說上次認識了memecached 執行緒,他對我說在他的幫助下快取了很多的使用者資料,還是分散式的!很多機器上都有!

我問他:“怪不得後來的登入操作快了那麼多,原來是不再從資料庫取資料了你那裡就有啊,哎對了你是分散式的你去過別的機器沒有?”

他說:“怎麼可能!我每次也只能通過網路往那個機器傳送一個GET、PUT命令才存取資料而已,別的一概不知。”

再比如說上次在等待的時候遇到了資料庫連線的執行緒,我才知道他那裡也是一個連線池,和我們的執行緒池幾乎一模一樣。

他告訴我:“有些包裹太變態了,竟然檢視一年的訂單資料,簡直把我累死了。”

我說:“拉倒吧你,你那是純資料,你把資料傳給我以後,我還得組裝成HTML,工作量不知道比你大多少倍。”

他建議我:“你一定要和memecached搞好關係,直接從他那兒拿資料,儘量少直接呼叫資料庫,這樣我們JDBC connection也能活得輕鬆點。”

我欣然接納:“好啊好啊,關鍵是你得提前把資料搞到快取啊,要不然我先問一遍快取,沒有資料,我這不還得找你嗎?”

生活就是這樣,如果你自己不找點樂子,還有什麼意思?

第三回 虎口脫險

 

前幾天我遇到一個可怕的事情,差一點死在外邊,回不了執行緒池了。其實這次遇險我應該能夠預想得到才對,真是太大意了。

那天我處理了一些從http發來的存款和取款的包裹,老執行緒0x6900特意囑咐我:“處理這些包裹的時候一定要特別小心,你必須先獲得一把鎖,在對賬戶存款或取款的時候一定要把賬戶鎖住,要不然別的執行緒就會在你等待的時候趁虛而入,搞破壞,我年輕那會兒很毛糙,就捅了簍子。”

為了“恐嚇”我, 好心的0x6900還給了我兩個表格:

(1)沒有加鎖的情況

(2)加鎖的情況

 

我看得膽顫心驚,原來不加鎖會帶來這麼嚴重的事故。從此以後看到存款、取款的包裹就倍加小心,還好沒有出過事故。

今天我收到的一個包裹是轉賬,從某著名演員的賬戶給某著名導演的賬戶轉錢,具體是誰我就不透漏了,數額可真是不小。

我按照老執行緒的吩咐,肯定要加鎖啊,先對著名演員的賬戶加鎖,再對著名導演的賬戶加鎖。

可我萬萬沒想到的是,還有一個執行緒,對,就是0x7954, 竟然同時在從這個導演的賬戶往這個演員的賬戶轉賬。 

於是乎,就出現了這麼個情況:

 

剛開始我還不知道什麼情況,一直坐在等待車間傻等,可是等的時間太長了,長達幾十秒!我可從來沒有經歷過這樣的事件。

這時候我就看到了執行緒0x7954 , 他悠閒地坐在那裡喝咖啡,我和他聊了起來:

“哥們,我看你已經喝了8杯咖啡了,怎麼還不去幹活?”

“你不喝了9杯茶了嗎?”0x7954回敬道。

“我在等一個鎖,不知道哪個孫子一直不釋放!”

“我也在等鎖啊,我要是知道哪個孫子不釋放鎖我非揍死他不可!”0x7954毫不示弱。

我偷偷地看了一眼,這傢伙懷裡不就抱著我正等的某導演的鎖嗎?

很明顯,0x7954也發現了我正抱著他正在等待的鎖。

很快我們兩個就吵了起來,互不相讓:

    “把你的鎖先給我,讓我先做完!”

“不行,從來都是做完工作才釋放鎖,現在絕對不能給你!”

從爭吵到打起來,就那麼幾秒鐘的事兒。更重要的是,我們倆不僅僅持有這個著名導演和演員的鎖,還有很多其他的鎖,導致等待的執行緒越來越多,圍觀的人們把屋子都擠滿了。最後事情真的鬧大了,我從來沒見過的終極大boss“作業系統”也來了。大Boss畢竟見多識廣,他看了一眼,哼了一聲,很不屑地說:

“又出現死鎖了。”

“你們倆要Kill掉一個,來吧,過來抽籤。”

這一下子把我給嚇尿了,這麼嚴重啊!我戰戰兢兢地抽了籤,開啟一看,是個“活”字。唉,小命終於保住了。

可憐的0x7954被迫交出了所有的資源以後,很不幸地被kill掉,消失了。我拿到了導演的鎖,可以開始幹活了。大Boss“作業系統”如一陣風似的消失了,身後只傳來他的聲音:

“記住,我們這裡導演>演員,無論任何情況都要先獲得導演的鎖。”

由於這裡不僅僅只有導演和演員,還有很多其他人,大Boss留下了一個表格, 裡邊是個演算法,用來計算資源的大小,計算出來以後,永遠按照從大到小的方式來獲得鎖:

我回到執行緒池,大家都知道了我的歷險,圍著我問個不停。

凶神惡煞的執行緒排程員把大Boss的演算法貼到了牆上。

每天早上,我們都得像無節操的房屋中介、美容美髮店的服務員一樣,站在門口,像被耍猴一樣大聲背誦:

多個資源加鎖要牢記,一定要按Boss的演算法比大小,然後從最大的開始加鎖。

第四回 江湖再見

又過了很多天,我和其他執行緒們發現了一個奇怪的事情:包裹的處理越來越簡單,不管任何包裹,不管是登入、瀏覽、存錢……處理的步驟都是一樣的, 返回一個固定的html頁面。

有一次我偷偷地看了一眼,上面寫著:“本系統將於今晚 00:00 至4:00 進行維護升級, 給您帶來的不便我們深感抱歉!”

我去告訴了老執行緒0x6904,他嘆了一口氣說:

“唉,我們的生命也到頭了,看來馬上就要重啟系統,我們就要消失了,再見吧兄弟。”

系統重啟的那一刻終於到來了。我看到屋子裡的東西一個個的不見了,等待車間、就緒車間,甚至CPU車間都慢慢地消失了。我身邊的執行緒兄弟也越來越少,最後只剩我自己了。

我在空曠的原野上大喊:“還有人嗎?”

無人應答。

我們這一代執行緒池完成了使命……

不過下一代執行緒池即將重生!

 

本文轉之碼農翻身微訊號如下