程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> (轉)趣文:我是一個線程,趣文我是線程

(轉)趣文:我是一個線程,趣文我是線程

編輯:關於PHP編程

(轉)趣文:我是一個線程,趣文我是線程


來自:碼農翻身(微信號:coderising)

作者:IBM劉欣  

我是一個線程, 我一出生就被編了個號: 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車間都慢慢的消失了。

我身邊的線程兄弟也越來越少, 最後只剩我自己了。 

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

無人應答。

我們這一代線程池完成了使命。

下一代線程池將很快重生。

(完)

如果您閱讀過此文章有所收獲,請為我頂一個,如果文章中有錯誤的地方,歡迎指出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved