Forken von Go-Prozessen: So erhalten Sie untergeordnete Prozess-IDs
Auf der Suche nach der Erstellung neuer Go-Prozesse bei gleichzeitiger Erlangung ihrer jeweiligen IDs hat der Exec und Betriebssystembibliotheken scheinen nicht in der Lage zu sein, das Forken zu erleichtern. Die Lösung liegt jedoch im Syscall-Paket und seiner Funktion syscall.ForkExec().
Es ist wichtig zu verstehen, dass fork() ursprünglich in einer Zeit ohne Threads konzipiert wurde, in der Prozesse nur über einen einzigen Ausführungsthread verfügten . Somit war das Forken ein unkomplizierter Vorgang. Gos starke Abhängigkeit von Threads für die Goroutine-Planung macht die Sache jedoch komplizierter.
Forking und Go-Parallelität
Forking unter Linux unter Go führt zu einem Problem. Der untergeordnete Prozess erbt nur den Thread, der den Fork initiiert hat, und lässt wichtige Threads aus, die von der Go-Laufzeit verwendet werden. Folglich kann der untergeordnete Prozess den Go-Code nicht weiter ausführen, sodass ein sofortiges exec(2) erforderlich ist. Dies ist genau der beabsichtigte Anwendungsfall für syscall.ForkExec().
Über das Forking in der heutigen Zeit hinaus
Moderne Anwendungen erfordern selten direkte fork()-Aufrufe. Es gibt eine sinnvolle Alternative für das „Best-Effort-Asynchronous-Process-State-Snapshotting“, wie in Redis zu sehen ist. Diese Technik nutzt die Vererbung der Speicherdatenseiten des untergeordneten Prozesses vom übergeordneten Prozess aus und ermöglicht es ihm, Datenstrukturen auf der Festplatte zu speichern, während der übergeordnete Prozess Änderungen in seinem eigenen Adressraum fortsetzt.
In allen anderen Szenarios wird die sofortige Ausführung bevorzugt Methode, wodurch Bibliotheken wie exec.Command() besser zum Erstellen und Verwalten untergeordneter Prozesse in Go geeignet sind.
Das obige ist der detaillierte Inhalt vonWie kann ich nach dem Forken in Go untergeordnete Prozess-IDs erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!