We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
記事の内容が間違っているという指摘ではないです。keen さんが知っている内容かもしれないです。誰かが見て少しでも役に立てばと思って書きました。
Go の API 上の I/O は基本ブロッキングです(ランタイムの話ではなく)。ランタイムはファイル I/O のブロッキング処理は別スレッドを起こして処理されます。なおご存じの通りこの数は GOMAXPROCS には依存しません。
ネットワーク I/O の場合はファイルと異なり受信待ちがあるのでその度にスレッドを作っていられません。そこで fd をノンブロッキングにして epoll で別スレッドで I/O を監視し、その fd でブロックしている(実際には何もせずスケジューラは回る) goroutine に通知しています。これが netpoller の役目です。ブロックしていた goroutine は通知を受けて受信処理を継続します。非同期にすると受信時に EWOULDBLOCK が返りうるのですがこうする事で不当たりも少なくしているのだと思います。また受信待ちの時でも余計にスレッドを起こさずにスケジューラを回させる為の方法だと思います。
なのでランタイムの動作としてはノンブロッキングですが、Go の API を触るユーザから見るとブロッキングに見えます。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
記事の内容が間違っているという指摘ではないです。keen さんが知っている内容かもしれないです。誰かが見て少しでも役に立てばと思って書きました。
Go の API 上の I/O は基本ブロッキングです(ランタイムの話ではなく)。ランタイムはファイル I/O のブロッキング処理は別スレッドを起こして処理されます。なおご存じの通りこの数は GOMAXPROCS には依存しません。
ネットワーク I/O の場合はファイルと異なり受信待ちがあるのでその度にスレッドを作っていられません。そこで fd をノンブロッキングにして epoll で別スレッドで I/O を監視し、その fd でブロックしている(実際には何もせずスケジューラは回る) goroutine に通知しています。これが netpoller の役目です。ブロックしていた goroutine は通知を受けて受信処理を継続します。非同期にすると受信時に EWOULDBLOCK が返りうるのですがこうする事で不当たりも少なくしているのだと思います。また受信待ちの時でも余計にスレッドを起こさずにスケジューラを回させる為の方法だと思います。
なのでランタイムの動作としてはノンブロッキングですが、Go の API を触るユーザから見るとブロッキングに見えます。
The text was updated successfully, but these errors were encountered: