標籤:

golang channel阻塞與非阻塞用法

以下代碼會deadlock

為什麼?因為push和pull永遠不可能同時發生,這就是阻塞channel的不當用法。

怎麼解決呢?可以這樣:

通過在另一個協程中run push代碼,使得channel的生產和消費可以同時對接,正常的阻塞使用方式。

還可以這樣:

給channel加一個buffer,只要buffer沒用盡,大家就不用阻塞。

「以為加buffer就不會阻塞了嗎?沒有數據pull的時候就會阻塞啊」——這個簡單啊:

這是非阻塞的pull channel

這是帶超時的pull channel

以上,很基礎,希望有用。

原帖:Go 這種逆天的語言,為什麼 5 年了,還沒有火起來呢? - Kenneth 的回答

推薦閱讀:

NBA首次舉辦編程馬拉松,深度數據已成球隊新寵
為什麼github不出中文版?
就入門級別而言,什麼樣的代碼才能叫做「優秀的代碼」?

TAG:Go语言 | 编程 |