私の理解では、非ブロッキング Web サーバー (node.js、eventmachine、tornado) は、ブロッキング ライブラリを呼び出すと停止する可能性があります。これはGolangにも当てはまりますか?1 つの goroutine がブロックされた場合、別の goroutine は自動的に CPU へのアクセスを許可されますか、それとも、ブロックされた goroutine が「解放」されるのを待つ必要がありますか? 前者ならライブラリはノンブロッキングでなくてもいいじゃないですか。非ブロッキングであることを明示的に示している Redis/Mongo ライブラリを見たことがないので、質問します。
1 に答える
私の理解では、非ブロッキング Web サーバー (node.js、eventmachine、tornado) は、ブロッキング ライブラリを呼び出すと停止する可能性があります。これはGolangにも当てはまりますか?
いいえ、そうではありません。Go ルーチンは IO で生成されるか、ランタイムが必要に応じて新しい OS スレッドを作成します。
1 つの goroutine がブロックされた場合、別の goroutine は自動的に CPU へのアクセスを許可されます
はい、そうです - go ルーチンは、あらゆる種類の IO またはチャネル通信に屈します。
それとも、ブロックされたゴルーチンが 'yield' するのを待つ必要がありますか?
いいえ、そうではありません。
前者ならライブラリはノンブロッキングでなくてもいいじゃないですか。非ブロッキングであることを明示的に示している Redis/Mongo ライブラリを見たことがないので、質問します。
ライブラリ (または一般的な Go コード) はノンブロッキングである必要がないため、作成と保守がはるかに簡単になります。私の意見では、これはGoの大きなプラスポイントです。ランタイムは、何千もの go ルーチンを巧妙に実行し、単純な命令型コードを記述するだけです。