Von dem, was ich here gelesen habe, wird der Golang Scheduler automatisch feststellen, ob eine Goroutine auf I/O blockiert, und wird automatisch zur Verarbeitung anderer Goroutines auf einem Thread, der nicht blockiert ist, wechseln.Wenn eine Goroutine bei E/A blockiert, wie erkennt der Scheduler, dass er nicht mehr blockiert?
Was ich frage mich ist, wie der Scheduler dann herausfindet, dass diese Goroutine auf I/O blockiert gestoppt hat.
Macht es nur eine Art von Abfragen, um zu überprüfen, ob es immer noch blockiert? Gibt es eine Art Hintergrund Thread, der den Status aller goroutines überprüft?
Zum Beispiel, wenn Sie eine HTTP-GET-Anforderung in einem goroutine zu tun sind, die 5s nahm eine Antwort zu bekommen, wäre es zu blockieren, während für die Antwort zu warten, und der Planer wechseln würde eine andere goroutine zu verarbeiten. Nun, wenn der Server eine Antwort zurückgibt, wie weiß der Scheduler, dass die Antwort angekommen ist, und es Zeit ist, zu der Goroutine zurückzukehren, die das GET gemacht hat, damit es das Ergebnis des GET verarbeiten kann?
Ich glaube, ich habe diesen Teil schon verstanden. Worüber ich wirklich neugierig bin, ist, wie dieser Teil "mich später wissen lassen wird, sobald das Ergebnis gelesen wurde". Wie überprüft es, ob "das Ergebnis gelesen wird" – m0meni
Normalerweise ein Signal verwenden. Eine bestimmte Funktion, die Sie angeben, wird also vom Kernel aufgerufen, wenn die IO fertig ist und diese Funktion damit umgehen kann, wie sie will. – joshlf
Aber woher wissen Sie, dass die IO gemacht wird? Ich verstehe die Idee eines Rückrufs, aber wie können Sie herausfinden, ob die IO-Operation abgeschlossen ist, wie in dem Beispiel, das ich oben über eine GET-Anfrage hinzugefügt habe. – m0meni