推 imreader: 補充你指出的 thread 問題,我若要做 multi-thread,12/24 21:42
→ imreader: 我會傾向使用 Node JS 的 Async 寫法,完全不用擔心12/24 21:43
→ imreader: Thread-safe 的問題12/24 21:44
→ imreader: 加上 ES2016 以後有 Async, Await 的終極方案12/24 21:44
可能我表達不夠清楚讓你誤會我意思了
我的意思是 Node 目前本質上是在 application level 的 single thread,
這讓他在同時運用多個 CPU 做事情會比 Java 還要有挑戰。
這意味著如果你想要榨乾多 CPU 系統效能的話, Node 會比 Java 需要花更多心力。
題外話,這件事 Golang 做的比兩者都好 (但還是有些小陷阱),算是整合兩邊所長。
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 21:52:42
推 imreader: 另外 Node JS 也可以用 coffeescript 做 transpiler12/24 21:52
→ imreader: 直接寫 python like 的排版語法來寫作12/24 21:53
→ imreader: 你自已都知道 PM2 了,再配合 async 寫法,12/24 21:54
→ imreader: 多 CPU 也能輕鬆運用12/24 21:54
→ imreader: 對我來講,這就起多個 node 行程,做 multi-workers 12/24 21:56
推 imreader: 用 python 的 celery 來寫 async,遠遠不及 node js 12/24 22:08
→ imreader: 的 async, await 直覺、易用12/24 22:08
我想我表達得不夠清楚,application level 的 thread 有幾種狀況不好處理:
1. 假設今天有一個計算類型的任務 (例如一個大陣列的 quick sort實作),Java 可以
比較輕鬆的運用多 CPU,拆多個子任務用 thread 就可以了。
Node 要運多 CPU 做這件事相對會麻煩很多。
2. 誠然,Node 用 cluster 跑多個 process 可以吃多個 CPU。
假設今天 Node 起了 cluster ,下面有四個 process 分別處理 request,
如果今天運氣不好,分配給第一個 process 的 requst 比較吃資源,其他則否,
那過一段時間後你會發現只剩第一個 process 在一個 CPU 上跑,
其他 process 對此無能為力。
3. process 和 process 間沒有共享記憶體,因此有當你決定要用 pm2 起 cluster
跑 web 時,就一定要用外部的 storage (ex. redis) 存 session。
當然這些情況是極端了點,我只是想說明用 Java (或 Golang,C#) 可以不用考慮這
些情況,而用 Node 你得依據你的使用情境考慮是否要y處理這些情況。
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 22:24:12
→ imreader: python 跟 node js 剛好一個同步、一個非同步互相搭配 12/24 22:09
推 Sirctal: C++不需要GC好嗎?? C++11有smart pointer...12/24 22:14
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 22:25:35
→ x000032001: 雖然不寫Java 它在大數據和企業級應用的確佔有一塊 12/24 22:37
→ x000032001: 一直鄙視而不正視它為何被使用 那是狂熱信徒才做的事12/24 22:38
噓 chiaming0914: 對c++不熟就不要隨便亂講 12/24 22:43
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 22:45:57
對不起,這點的確是我說錯,已修正原文。
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 22:50:16
→ elements: smart ptr 比起 GC 有更多眉角,c++ 也有 mark and swe12/24 22:49
→ elements: ep 就是了,只是要另外弄。 12/24 22:49
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 22:52:21
推 backprog: 這邊夠詳細推12/24 22:52
→ remmurds: 某樓怎摸會把async跟multi thread混為一談...12/24 23:02
推 imreader: 某樓不用指正教學,thread 跟 async 本質有差我知道12/24 23:07
→ imreader: 但能不用 multi-thread 寫的話,我會盡量不用 12/24 23:08
推 nbajam: 認同給推12/24 23:09
推 imreader: 對 async, multi-thread 區別有興趣的話,可以看這篇12/24 23:13
→ imreader: 但對我來講 thread-safe ,寫起來直覺,就很好用了12/24 23:13
推 CGS0: c++ 寫的好 就保持習慣 做的比 Java 的 GC 還爛 應該是很快12/24 23:21
→ CGS0: 就不行了12/24 23:21
→ CGS0: 請講自己寫很久的部份就好 不用亂猜其他語言 12/24 23:22
C++ 這點是我疏忽,請其他版友不要被我誤導
推 TeddyCaptain: imreader是在供三小,“我若要寫multi-thread,會傾12/24 23:28
→ TeddyCaptain: 向使用node的async寫法”,這句話邏輯在哪?? 被糾12/24 23:28
→ TeddyCaptain: 正還7pupu 12/24 23:28
※ 編輯: tofuflower (42.77.40.73), 12/24/2017 23:32:24
推 TeddyCaptain: 講錯被糾正像原po那樣不是很好ㄇ,硬掰當沒人懂node12/24 23:31
→ TeddyCaptain: 膩12/24 23:31
推 imreader: 上面我給的文章先看完,最後有 async callback 的說明12/24 23:32
→ imreader: 這裡都要咬文嚼字,用字精準,也太累了 12/24 23:33
→ imreader: 我明確的說,multi-thread 大部份就是要做非同步的作業 12/24 23:33
→ imreader: 像偵測 UI 按鍵時,還能讀取檔案I/O12/24 23:33
→ imreader: 檔案讀取完,直接呼叫 callback function 12/24 23:34
→ imreader: 這種工作,若在 python 就要開 thread 來寫 12/24 23:34
→ imreader: 但 node js 就直接 async callback 的寫法 12/24 23:34
推 imreader: 好了,來玩電動了,剩下的我就不回了 XD 12/24 23:36
推 TeddyCaptain: 還在凹捏,node在處理io以外的工作沒辦法做到實質上 12/24 23:49
→ TeddyCaptain: 的multithreading本來就是天生的痛點,這個原po已經 12/24 23:49
→ TeddyCaptain: 講的很清楚了,你還在那邊用async解,看到豆頁都痛 12/24 23:49
→ TeddyCaptain: ㄌ說 12/24 23:49
推 s25g5d4: imreader 搞清楚 CPU-bound 跟 IO-bound 差別好嗎 12/24 23:56
噓 kwpn: C++根本就不需要GC 你根本不懂GC是啥吧? 12/24 23:57
我為錯誤的言致歉,已更改原文
※ 編輯: tofuflower (42.77.40.73), 12/25/2017 00:00:16
→ elements: 現在的 io 大多不用 block,而是用 epoll 交給作業系統 12/24 23:58
→ elements: 去等,只要少少幾條專有的執行緒跑事件迴圈就可以了。 12/24 23:58
→ elements: 但多執行緒一個很重要的用途是利用多核心,這點如果你 12/24 23:58
→ elements: 自己的code沒辦法泡在其他 thread 就沒辦法 12/24 23:58
推 imreader: 就算是 IO-bound 在 python,是不是要用 thread 來寫 12/25 00:07
推 TeddyCaptain: 奇怪捏,原po有像imreader一樣在那邊硬凹ㄇ?第一 12/25 00:08
→ TeddyCaptain: 個幫忙糾錯的很好,大家有交流才有進步嘛,啊他不是 12/25 00:08
→ imreader: 光確認 thread-safe,就不是很直覺的事了 12/25 00:08
→ TeddyCaptain: 也修文跟道歉了?後面一堆眼紅好像要把人往死裡嗆 12/25 00:08
→ TeddyCaptain: 的是怎樣,而且還是嗆一樣的東西,一點幫助都沒有, 12/25 00:08
→ TeddyCaptain: 是要他下跪膩 12/25 00:08
→ elements: 老實說c++我一直不覺得你講錯什麼,記憶體管理的確是一 12/25 00:09
→ elements: 個很大的痛點,特別是你在專案大又多執行緒的時候,所 12/25 00:09
→ elements: 有權的問題有時候很難釐清。但那就是你要把控制記憶體 12/25 00:09
→ elements: 釋放時機的權力拿回手上的代價。 12/25 00:09
→ imreader: CPU bound 我前面不是有寫過,就改用 multi-workers 12/25 00:09
→ imreader: 大家好像覺得寫 thread 的程式,是很輕鬆容易的事一樣 12/25 00:10
→ imreader: 我可不認為,能不寫就不寫 12/25 00:10
→ laputaflutin: 非同步跟執行緒的問題本質完全不一樣啊,更別說pyt 12/25 00:11
→ laputaflutin: hon也有 async 語法了……這根本不是什麼咬文嚼字 12/25 00:11
→ laputaflutin: ,而是理解有誤 12/25 00:11
→ TeddyCaptain: 我也是覺得寫db操作好麻煩,應該都in-memory就好, 12/25 00:26
→ TeddyCaptain: 能不寫就不寫 12/25 00:26
→ ku399999: XD 12/25 00:29
推 sky790312: 現在JS ide都能裝coding style不會到CICD才發現;錯誤@@ 12/25 00:38
謝提醒,修正原文
※ 編輯: tofuflower (42.77.40.73), 12/25/2017 00:49:12
→ alan3100: 我覺得你要認真回他是件很辛苦的事 不會有交集 12/25 00:57
推 s25g5d4: 講幾個補充好了,本公司用 TypeScript 開發,雖然是 12/25 01:09
→ s25g5d4: compile time check 而已,但已經比純 JS 好太多了 12/25 01:10
→ s25g5d4: 少個 ; 甚至 type 不對的問題都有解,只是很麻煩是真的 12/25 01:10
→ s25g5d4: 有些人認為這樣就喪失 JS 靈活的特性了,但我覺得還好, 12/25 01:10
推 TitanEric: 推這篇 學到好多 12/25 01:16
推 chatnoir: 這篇..其實不錯! 12/25 01:29
→ bcew: python也有pylint可以coding時發現語法問題喔 12/25 01:38
推 steve1012: 我感覺修正完還是有點問題啊 建議你把 c++ gc整段移掉 12/25 01:54
→ steve1012: 吧 並不是那樣 12/25 01:54
如同前面板友提到的,我不應該對自己不熟的語言妄下評論,因此原文在最前面提醒讀者
"這段評論是有問題的"。但在我搞清楚 C++ 的 GC 前,我不會再去對 C++ 的記憶體管理
做其他評論。
推 Shauter: Java好棒喔 就交給各位寫了 12/25 01:55
不,因為原文的推文在戰 Java,所以這篇文章才會討論到比較多我覺得 Java 比較佔優
勢的情境。但 Java 倒沒有威猛到可以統一全程式:
1. 論語法簡潔,開發速度遠不如 Python,Golang
(更別提資份分析領域,Python 的確表現遠比 Java 好)
2. 論效能被 C 家族屌打
3. 程式啟動速度的確是慢,尤其你用了 spring 系列以後,那啟動速度簡直令人頭痛
(希望 Java9 的模組化有解決這點)
我的想法是每個語言都有擅長處理和不擅長處理的情境,我更傾向是大家一起分享各自
熟悉的語言在什麼情況下有優勢,在什麼情況下相對會花更多心思處理。
以 Python 為例,雖然 Python 在處理高併發並不如他在其他領域表現優越,但 IG 工
程師就是熱愛他的開發快速,因此花不少心力在調校 Python runtime 效能 (例如關掉
GC)。
因此,單你的使用情境是高併發需求,而你的工程團隊又沒有 IG 如此強悍時,Python
可能不是你的首選。
反之若高併發並不讓你覺得痛 (老子有一票慓悍的工程師 or 老子有本錢在 AWS 開幾百
台機器),在搶開發速度上我也是選 Python。
→ obamina48: imreader 真的懂 JS 嗎… 12/25 02:06
推 sorryla: C++引入smart pointer後,記憶體管理早就沒那麼難了。 12/25 03:53
→ sorryla: 物件所有權很難釐清,丟給GC就萬事解決了嗎?你怎麼知道G 12/25 03:56
→ sorryla: C會不會真的幫你解決?物件關係沒處理好GC一樣幫不了你。 12/25 03:56
→ sorryla: 自己不搞懂只想讓GC擦屁股並不是好的作法。 12/25 03:56
GC 的確不是萬靈藥。我的想法是有一套現成已經通過時間考驗的 GC 機制,是 Java
一項優勢之一,但不是有了 GC 就無敵了。
物件沒處理好的確也會有 memory leak 的問題, Java 相對的優勢僅止於他可以讓工程
師比較輕鬆的處理 GC,但不代表工程師可以不用了解 GC。
→ kwpn: 只學半套的才會說C++記憶體很難管理 12/25 08:25
的確我對 C 系列只學半套,因此我對我妄下評論深感道歉。
但同時我是真的覺得大系統的 GC 是件很困難的事。
由於我覺得一篇文章被指出錯誤,那麼這個錯誤的地方和討論錯誤的評論就應該保留著,
讓後來看到這篇文章的讀者可以知道 context,因此我選擇在原文前面註記這段內容是有
問題的,而不是刪除該內容。
※ 編輯: tofuflower (223.140.91.246), 12/25/2017 09:11:05
推 johnny94: 這篇很好啊,講錯點出來就好了,一堆人往死裡嗆是怎樣? 12/25 08:57
推 Sirctal: 推樓上 我也覺得大家太嗜血了 有錯點一下就好 12/25 09:01
→ Sirctal: 只是討論而已有必要這樣?? 自古以來文人總是相輕... 12/25 09:01
推 steve1012: 還好啦 我覺得錯的拿掉就好 就不會繼續回啦 12/25 09:06
我願意道歉,並註記這段內容是有問題的,但不會刪除原文,原因如上述。
更何況刪了原文就吸引不到高手幫我做 C 語言教學了 (欸?
→ alan3100: 這篇不是特別回應某個躲在推文講大話的人嗎? 戰火沒交集 12/25 09:10
※ 編輯: tofuflower (223.140.91.246), 12/25/2017 09:15:28
→ testPtt: C++因為沒批次釋放的需要 所以不需要GC 12/25 09:27
噓 Sidney0503: C++從頭到尾就是錯的 你改了幾次都是錯的 12/25 09:58
噓 Ommm5566: 哈哈哈 做不到就說盡量不用 然後繼續鼓吹該語言無敵 12/25 10:12
→ Ommm5566: "不怕神一般的敵人 就怕豬一般的隊友"這句話真是經典 12/25 10:15
推 Ommm5566: 語法問題都有lint提示了 coding sytle不是問題 12/25 10:20
→ Ommm5566: python明明就有各種level的multi-thread 12/25 10:21
→ Ommm5566: 可以由使用者選擇要不要fork 12/25 10:22
推 loxyz: 願意分享看法推 12/25 10:26
推 imreader: 我想起來了,之前不用 python thread 的原因 12/25 10:27
→ imreader: 是因為 thread 裡用到的 module 也必須是 thread safe 12/25 10:27
→ imreader: 然後就找到 gevent 這種 coroutine 的東西 12/25 10:28
→ imreader: 用起來渾身不自在。然後 node js 開始用了以後 12/25 10:28
→ imreader: 發覺不用理會 thread-safe ,還能做 non-blocking 的 12/25 10:29
→ imreader: 非同步作業。若是要用多 CPU,也能用 PM2 的 cluster 12/25 10:29
推 Sidney0503: 因為我不會malloc和free 所以我都使用不須delete的語 12/25 10:30
→ imreader: 若 thread 用到的 module 也要 thread-safe 這樣就 12/25 10:30
→ Sidney0503: c語言真他媽有夠廢 還要人工free 12/25 10:30
→ imreader: 讓 python 豐富模組庫的好處盡失 12/25 10:30
→ Sidney0503: 指標有夠爛 動不動就跟我報讀取非法區間的error 12/25 10:30
→ imreader: 尤其是第三方的,很多都沒有 thread safe 12/25 10:31
→ imreader: 基本上我本身是 python, node js 混用的 12/25 10:31
→ Sidney0503: c語言看TIOBE可以看到正在下降 12/25 10:32
→ imreader: node js 我也是開 coffeescript 寫 python 的類似語法XD 12/25 10:32
→ Sidney0503: 大家還是不要用c語言好了 沒有保證memory safty 12/25 10:32
推 fishlinghu: 怎麼有人不會用怪語言爛啊XDDDD 12/25 10:33
→ Sidney0503: 沒有mem-safty的語言用起來渾身不自在 12/25 10:33
→ fishlinghu: 我好像被反串釣到惹XDDD 12/25 10:33
→ Sidney0503: 對我而言要memory safty超不直覺 12/25 10:34
推 rayway30419: 自己注意thread safe不是很合理嗎wwwww 12/25 10:38
→ imreader: 目前 node.js 會依 OS 自行選用 epoll、poll、dev/poll 12/25 10:39
→ imreader: select 和kqueue 12/25 10:39
→ imreader: @rayway30419,主要是引用的第三方別人寫的 module 12/25 10:40
→ imreader: 也要 thread-safe 12/25 10:40
推 Sidney0503: 我推薦大家使用rust 這才有guaranteed memory safety 12/25 10:44
→ Sidney0503: 大家好像覺得寫pointer的程式,是很輕鬆容易的事一樣 12/25 10:46
→ Sidney0503: 我可不認為,能不寫就不寫 12/25 10:46
→ Sidney0503: 但對我來講memory safe ,寫起來直覺,就很好用了 12/25 10:47
推 imreader: 樓上在開我玩笑,但我認同這點。因為在 python, node js 12/25 10:47
→ imreader: 不需 pointer ,就能做 pointer 能做到的事 12/25 10:47
→ imreader: 動態資料結構都能用 python, node js 來製作 12/25 10:48
推 imreader: 另外,我也來推廣一下 coffeescript 12/25 11:15
→ imreader: 不知道有沒有 python 的愛好者,夢想有天也能在前端寫 12/25 11:15
→ imreader: python 的語法,coffeescript 就是解方 12/25 11:16
→ imreader: 目前還能搭配 es2016 的 module 封裝, 12/25 11:16
→ imreader: 還有 async, await 輕鬆解決 callback hell 12/25 11:17
→ imreader: class 跟 python 特有的縮排對齊都能用 12/25 11:19
推 imreader: coffee 不只能寫前端,還能用在 NODE JS 12/25 11:36
噓 pttuser: C++ 效能並不一定總是能樂勝 Java ?呵呵一堆幹話 12/25 12:07
推 vvind: 推 12/25 12:44
推 sssh9300662: 推分享,有錯也沒關係,怎一堆人一定要抓錯酸一下, 12/25 12:55
→ sssh9300662: 有討論才有進步阿 12/25 12:55
→ sssh9300662: Async跟multi thread完完全全兩回事,可以的話我也不 12/25 12:56
→ sssh9300662: 想碰multi thread阿XD 12/25 12:56
→ zenixls2: 這篇內文到推文我到底看了啥... 12/25 12:59
→ alan3100: 推文亂七八糟真的很無言 12/25 13:46
推 dragoncfe168: C#現在已可跨平台了 蠻想專精C#就好 貪多嚼不爛@@ 12/25 13:49
→ dragoncfe168: 人生又不是很長 何不專注把C#學精熟?! 12/25 13:50
推 dragoncfe168: 俗話說:螣蛇無足而飛,梧鼠五技而窮!╮(﹀_﹀")╭ 12/25 13:53
推 wildli0422: 好文給推 謝謝分享 12/25 15:38
推 Bencrie: 嗆人才能突顯自己念名校的尊爵不凡 XD 12/25 18:07
推 gmoz: 推 12/25 18:11
推 yupog2003: 推原po理性討論 12/25 22:30
推 Darkautism: 真的假的 我都寫c欸 沒想到free被大家嫌 12/26 00:53
噓 jpopaholic: 只要jvm不死的話java就不會死,Hadoop,spark,jsp,甚 12/26 01:06
→ jpopaholic: 至偷改的android,都是base on java 12/26 01:06
推 clairehuei: 瑕不掩瑜,不懂某些人是在崩潰啥... 12/26 11:59
推 DolphinLinn: 我想說的是node本身就有Cluster模組 不需要使用pm2 12/26 15:01
→ DolphinLinn: 也可以... 12/26 15:01
推 aszx4510: 整理的很棒 感謝資訊分享 12/26 15:01
推 Shauter: base on java 好個阿Q想法 XDDDDDDD 12/27 10:48
→ realmeat: 不用IDE開發就好了, 何時IDE也成了原罪, 超級有趣 12/29 09:49