2013-07-24 54 views
2

我的理解是,如果阻塞的庫調用,非阻塞的Web服務器(node.js,eventmachine,tornado)可能會停下來。這對於Golang也是如此嗎?如果一個goroutine被阻塞,是另一個自動給予CPU的訪問權限,還是需要等待阻塞的goroutine'yield'?如果是前者,那麼圖書館不需要非阻塞,是嗎?我問,因爲我沒有看到任何明確聲明它們是非阻塞的Redis/Mongo庫。Golang - 圖書館需要非阻塞嗎?

回答

7

我的理解是,非阻斷的Web服務器(node.js的, EventMachine的,龍捲風)可以運轉了,如果他們作出一個 堵庫的調用。這對於Golang也是如此嗎?

不,它不是。 Go例程將在IO上產生,或者運行時將根據需要創建新的OS線程。

如果一個夠程被封鎖,是一個又一個自動獲得 訪問CPU

是的,它就是 - 去程序上的任何類型的IO或信道通信的產生。

還是他們不得不等待被封鎖的goroutine'屈服'?

不,他們沒有。

如果是前者,那麼庫不需要是非阻塞的,他們做 呢?我問,因爲我沒有看到任何明確聲明它們是非阻塞的Redis/Mongo庫。

沒有庫(或一般的Go代碼)不需要是非阻塞的,這使得它們更容易編寫和維護。在我看來,這是Go的主要優點。運行時不需要運行1000個例程,而只需編寫簡單的命令式代碼。

+0

因此,如果一個goroutine被阻塞,它不會阻塞整個線程(它與其他goroutines共享)?如果是這種情況,那麼你唯一需要編寫回調代碼的時候是當你想要這個特定的goroutine繼續,而不是切換到另一個時(我猜測這很罕見)? – tldr

+2

你不使用回調。你會把這個「阻塞的東西」放在一個單獨的goroutine中,然後用它來通道,以便在完成時「回話」。 –

+0

@尼克你的三重否定很難理解,請澄清。 (「沒有圖書館...」) – thwd