這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
我
Lua,Erlang,go這種只有協程或者所謂的輕量級"進程"的語言,雖然它們讓程式執行變得可以控制,假如:他們即使一下子開了1000個線程,實際上一次只能運行1個線程,本身並沒有利用多核的優勢。 假如:讓這幾種語言和具有真正線程概念能利用多核cpu的java對比下。 如果一下子都處理1000個任務,因為前幾個語言沒有利用多核cpu,那處理速度會不會比java慢很多呢? 這個怎麼理解。
找了很多資料,他們只介紹了:lua的協程或者Erlang的進程,只是說讓程式變得可控這種優勢,但是卻沒介紹:如果這種不是真正的“線程”的語言來處理任務時,是否會處理的緩慢等問題。
可以查看lua原始碼,比如:lua的協程,我可以找到lua_newthread這個實現,實際用的堆棧來實現的線程.
而且:雲風的skynet這個伺服器端架構,利用actor模型,裡面主要就是用的協程,實際開發中,並沒有我說的那個問題。所以我想知道:我哪裡理解錯了。
有種BUG叫設計如此 12:55:05
你的疑問是什麼啊?
有種BUG叫設計如此 12:57:10
不能利用多和資源是吧
有種BUG叫設計如此 12:58:08
最簡單的寫個程式試試就知道了,協程裡面寫死迴圈看,能不能把cpu跑到100%
Lukey 13:01:41
我就在用go
Lukey 13:01:45
確實不錯
王哲小號 13:02:20
lua的“協程”並不是線程,說到底,這1000個協程一定是順序執行的,嚴格來說,它是在某個線程環境下執行的,除掉本身的消耗,它的消耗另外一部分在管理這些協程以及代碼跳轉,至於是否能夠利用到多核,取決於上層的進階語言對於線程的效能能否較好的分攤到多核上去。
王哲小號 13:03:21
golang在設計之初就是針對多核的,所以上層語言的設定就針對多核下的環境,golang中很多東西都針對多核進行了特別的最佳化。
海浪 13:07:03
我想問的是。。。你糾結攜程是不是利用多核,是要幹啥
王哲小號 13:07:42
這個是在語言設計層面需要考慮的事情
有種BUG叫設計如此 13:08:06
邏輯上也需要考慮 的
王哲小號 13:08:07
至今還沒有看到過哪種語言還需要你手動考慮到多核的
王哲小號 13:08:24
比如?
有種BUG叫設計如此 13:08:56
至少要知道才知道什麼時候用進程,什麼時候用線程,什麼時候用協程啊
海浪 13:09:35
你連這都不知道。。。。。
王哲小號 13:09:49
這個我覺得更多的程式效能上面的事情
王哲小號 13:09:57
而不是考慮多核
王哲小號 13:10:25
一個問題不只有一種解,我們要的是最優解
有種BUG叫設計如此 13:10:45
如果你不知道一個語言的協程是不是可以指派到多核處理,那就是連那些也不知道唄
王哲小號 13:10:48
進程、線程這種解是不是最優,我覺得具有一定的討論餘地
有種BUG叫設計如此 13:18:28
一個lua vm對應一個os 線程
有種BUG叫設計如此 13:18:49
skynet 應該是用的多個lua vm利用的多核資源
北京|欠費 13:32:23
是否使用多核 編譯器上面考慮的吧 你在語言層面 考慮沒有意義。
有種BUG叫設計如此 13:41:23
我覺得不管是編輯器語言層面,還是架構層面,還是邏輯層面,都需要考慮,才能寫出好程式