Skip to content
New issue

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

「非同期とノンブロッキングとあと何か」について #1

Open
mattn opened this issue May 20, 2017 · 0 comments
Open

Comments

@mattn
Copy link

mattn commented May 20, 2017

記事の内容が間違っているという指摘ではないです。keen さんが知っている内容かもしれないです。誰かが見て少しでも役に立てばと思って書きました。

Go の API 上の I/O は基本ブロッキングです(ランタイムの話ではなく)。ランタイムはファイル I/O のブロッキング処理は別スレッドを起こして処理されます。なおご存じの通りこの数は GOMAXPROCS には依存しません。

ネットワーク I/O の場合はファイルと異なり受信待ちがあるのでその度にスレッドを作っていられません。そこで fd をノンブロッキングにして epoll で別スレッドで I/O を監視し、その fd でブロックしている(実際には何もせずスケジューラは回る) goroutine に通知しています。これが netpoller の役目です。ブロックしていた goroutine は通知を受けて受信処理を継続します。非同期にすると受信時に EWOULDBLOCK が返りうるのですがこうする事で不当たりも少なくしているのだと思います。また受信待ちの時でも余計にスレッドを起こさずにスケジューラを回させる為の方法だと思います。

なのでランタイムの動作としてはノンブロッキングですが、Go の API を触るユーザから見るとブロッキングに見えます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant