So implementieren Sie die Parallelitätskontrolle in der Go-Sprache
Methoden zur Implementierung der Parallelitätskontrolle in der Go-Sprache: 1. WaitGroup, die Aufgabenverarbeitung mehrerer Goroutinen hat eine Abhängigkeits- oder Spleißbeziehung; 2. Kanal, Sie können die Arbeit von WaitGroup aktiv abbrechen; erfüllen die Funktionen von Kontext 3. Kontext, Signalausbreitung zwischen mehrstufigen Groutinen, einschließlich Metadatenausbreitung, Aufhebung der Signalausbreitung, Timeout-Kontrolle usw.
Die Betriebsumgebung dieses Artikels: Windows 10-System, go1.20-Version, Dell G3-Computer.
In Golang können Sie eine Goroutine über das Schlüsselwort go öffnen, sodass Sie problemlos gleichzeitigen Code in Go schreiben können. Aber wie kann man diese gleichzeitig ausgeführten Groutinen effektiv kontrollieren?
Bei der Parallelitätskontrolle denken viele Menschen vielleicht zuerst an Sperren. Golang bietet auch sperrbezogene Mechanismen, einschließlich Mutex-Sperre sync.Mutex und Lese-/Schreibsperre sync.RWMutex. Neben Sperren gibt es auch atomare Operationen sync/atomic usw. Der Fokus dieser Mechanismen liegt jedoch auf der gleichzeitigen Datensicherheit von Goroutinen. In diesem Artikel geht es um die Kontrolle des Parallelitätsverhaltens von Goroutine.
In der gleichzeitigen Verhaltenskontrolle von Goroutine gibt es drei gängige Methoden: WaitGroup, Channel und Context.
WaitGroup
WaitGroup befindet sich im Synchronisierungspaket und wird wie folgt verwendet.
func main() { var wg sync.WaitGroup wg.Add(2) //添加需要完成的工作量2 go func() { wg.Done() //完成工作量1 fmt.Println("goroutine 1 完成工作!") }() go func() { wg.Done() //完成工作量1 fmt.Println("goroutine 2 完成工作!") }() wg.Wait() //等待工作量2均完成 fmt.Println("所有的goroutine均已完成工作!")}输出: //goroutine 2 完成工作! //goroutine 1 完成工作! //所有的goroutine均已完成工作!
WaitGroup Diese Parallelitätskontrollmethode eignet sich besonders für Situationen, in denen eine bestimmte Aufgabe die Zusammenarbeit mehrerer Goroutinen erfordert und jede Goroutine nur einen Teil der Aufgabe erledigen kann. Die Aufgabe wird erst abgeschlossen, wenn alle Goroutinen abgeschlossen sind. Daher hat WaitGroup dieselbe Bedeutung wie sein Name, nämlich eine Art des Wartens.
Im tatsächlichen Geschäftsleben gibt es jedoch ein Szenario: Wenn eine bestimmte Anforderung erfüllt ist, muss eine bestimmte Goroutine aktiv benachrichtigt werden, um beendet zu werden. Wenn wir beispielsweise eine Hintergrundüberwachungs-Goroutine starten und die Überwachung nicht mehr benötigt wird, sollten wir die Überwachungs-Goroutine über das Ende informieren, da sie sonst im Leerlauf bleibt und Lecks verursacht.
Channel
Für das obige Szenario ist WaitGroup machtlos. Die einfachste Methode, die man sich vorstellen kann, besteht darin, eine globale Variable zu definieren und sie durch Ändern dieser Variablen an anderer Stelle zu benachrichtigen. Wenn sie feststellt, dass sich die Variable geändert hat, wird diese Methode geschlossen ist etwas umständlich. In diesem Fall kann Kanal+Auswahl hilfreich sein.
func main() { exit := make(chan bool) go func() { for { select { case <-exit: fmt.Println("退出监控") return default: fmt.Println("监控中") time.Sleep(2 * time.Second) } } }() time.Sleep(5 * time.Second) fmt.Println("通知监控退出") exit <- true //防止main goroutine过早退出 time.Sleep(5 * time.Second)}输出: //监控中 //监控中 //监控中 //通知监控退出 //退出监控
Diese Kombination aus Kanal+Auswahl ist eine elegantere Möglichkeit, die Goroutine über das Ende zu informieren.
Diese Lösung weist jedoch auch Einschränkungen auf. Stellen Sie sich vor, was wäre, wenn es mehrere Goroutinen gäbe, die alle kontrolliert werden müssten, um zu beenden? Was wäre, wenn diese Goroutinen andere Goroutinen hervorbringen würden? Natürlich können wir viele Kanäle definieren, um dieses Problem zu lösen, aber die Beziehungskette von Goroutinen führt zur Komplexität dieses Szenarios.
Kontext
Die oben genannten Szenarien sind im CS-Architekturmodell üblich. In Go wird oft eine separate Goroutine (A) für jeden Client geöffnet, um seine Reihe von Anfragen zu bearbeiten, und oft fordert ein einzelner A auch andere Dienste an (startet eine andere Goroutine B), und B kann auch eine andere Goroutine C, C anfordern Anschließend wird die Anfrage an einen Server wie Databse gesendet. Stellen Sie sich vor, dass, wenn der Client die Verbindung trennt, A, B und C, die ihm zugeordnet sind, sofort beendet werden müssen, bevor das System die von A, B und C belegten Ressourcen zurückgewinnen kann. Das Verlassen von A ist einfach, aber wie kann man B und C benachrichtigen, dass sie ebenfalls verlassen sollen?
Zu diesem Zeitpunkt erscheint Kontext.
func A(ctx context.Context, name string) { go B(ctx ,name) //A调用了B for { select { case <-ctx.Done(): fmt.Println(name, "A退出") return default: fmt.Println(name, "A do something") time.Sleep(2 * time.Second) } }}func B(ctx context.Context, name string) { for { select { case <-ctx.Done(): fmt.Println(name, "B退出") return default: fmt.Println(name, "B do something") time.Sleep(2 * time.Second) } }}func main() { ctx, cancel := context.WithCancel(context.Background()) go A(ctx, "【请求1】") //模拟client来了1个连接请求 time.Sleep(3 * time.Second) fmt.Println("client断开连接,通知对应处理client请求的A,B退出") cancel() //假设满足某条件client断开了连接,那么就传播取消信号,ctx.Done()中得到取消信号 time.Sleep(3 * time.Second)}输出: //【请求1】 A do something //【请求1】 B do something //【请求1】 A do something //【请求1】 B do something //client断开连接,通知对应处理client请求的A,B退出 //【请求1】 B退出 //【请求1】 A退出
Im Beispiel wird eine Verbindungsanfrage vom Client simuliert und Goroutine A wird entsprechend für die Verarbeitung von A geöffnet. Sowohl A als auch B verwenden den Kontext zur Nachverfolgung , diese beiden Alle Goroutinen werden beendet.
Dies ist die Kontrollfunktion von Context. Nach dem Drücken des Schalters erhalten alle auf diesem Kontext basierenden oder davon abgeleiteten Unterkontexte Benachrichtigungen endlich veröffentlicht Dies löst auf elegante Weise das Problem der unkontrollierbaren Goroutine nach dem Start.
Die detaillierte Verwendung von Kontext würde den Rahmen dieses Artikels sprengen. Es wird einen Folgeartikel geben, in dem das Kontextpaket speziell erläutert wird. Bleiben Sie also auf dem Laufenden.
Zusammenfassung
In diesem Artikel werden drei Modi zur Steuerung des Parallelitätsverhaltens in Golang aufgeführt. Es gibt keine gute oder schlechte Unterscheidung zwischen den Modi, es kommt lediglich darauf an, geeignete Lösungen für verschiedene Szenarien zu verwenden. In tatsächlichen Projekten werden häufig mehrere Methoden kombiniert verwendet.
- WaitGroup: Es besteht eine Abhängigkeit oder Spleißbeziehung zwischen der Aufgabenverarbeitung mehrerer Goroutinen.
- channel+select: Sie können Goroutine aktiv abbrechen; die Datenübertragung in mehreren Groutinen kann die Arbeit von WaitGroup ersetzen, aber es erhöht die Komplexität der Codelogik, kann aber auch den Code erfüllen Logikkomplex.
- Kontext: Signalausbreitung zwischen mehrstufigen Groutinen (einschließlich Metadatenausbreitung, Aufhebung der Signalausbreitung, Timeout-Kontrolle usw.).
In Golang können Sie eine Goroutine über das Schlüsselwort go öffnen, sodass Sie problemlos gleichzeitigen Code in Go schreiben können. Aber wie kann man diese gleichzeitig ausgeführten Groutinen effektiv kontrollieren?
Wenn es um Parallelitätskontrolle geht, denken viele Menschen vielleicht zuerst an Sperren. Golang bietet auch sperrbezogene Mechanismen, einschließlich Mutex-Sperre sync.Mutex und Lese-/Schreibsperre sync.RWMutex. Neben Sperren gibt es auch atomare Operationen sync/atomic usw. Der Fokus dieser Mechanismen liegt jedoch auf der gleichzeitigen Datensicherheit von Goroutinen. In diesem Artikel geht es um die Kontrolle des Parallelitätsverhaltens von Goroutine.
In der gleichzeitigen Verhaltenskontrolle von Goroutine gibt es drei gängige Methoden: WaitGroup, Channel und Context.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Parallelitätskontrolle in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Der Geräte -Manager zeigt Ausrufezeichen an, die normalerweise durch Hardwareverbindungsprobleme oder Treiberstörungen verursacht werden. Die Lösungen lauten wie folgt: 1. Überprüfen Sie die Geräteverbindung und die Stromversorgung, stellen Sie sicher, dass sie angeschlossen und ausgeschlossen sind und Live -Hub verwendet oder die Schnittstelle ersetzen. 2. Aktualisieren oder rollen Sie den Fahrer zurück und erhalten Sie den neuesten Treiber über die Geräte -Manager oder die offizielle Website. 3.. Reinigen Sie die Restinformationen des alten Geräts, deinstallieren Sie das versteckte Gerät und identifizieren Sie es neu. V. Wenn es immer noch nicht gelöst werden kann, installieren Sie das System neu.

Führen Sie zuerst den Power-Fehlerbehebungsmittel aus und verwenden Sie die Eingabeaufforderung für die Administrator, um den Befehl powerCfg-restoredefaultschemes auszuführen, um das Power-Schema zurückzusetzen, dann den ACPI-Treiber zu aktualisieren oder neu zu installieren. Überprüfen Sie die Einstellungen für die Richtlinien (Pro/Enterprise Edition), führen Sie SFC/Scannow aus, um die Systemdateien zu reparieren und zu ermitteln, ob das Problem des Benutzers ein neues Benutzerkonto erstellt wird. In den meisten Fällen werden die Stromversorgungsoptionen wieder normalisiert.

Der Fehler "Thesecified Modul konnte nicht gefunden werden" wird normalerweise durch fehlende oder beschädigte DLL -Dateien verursacht, nicht durch die Installation von VisualC -Umteilbaren Paket, beschädigten Systemdateien oder Missverständnissen der Modulpfade. Sie können sie beheben und beheben, indem Sie die Schritte folgen: 1. Installieren oder reparieren Sie Microsoft Visualc -Umteilungsabweichung; 2. Verwenden Sie SFC/Scannow- und DISM -Tools, um Systemdateien zu reparieren. 3.. Laden Sie die fehlenden DLL-Dateien herunter und registrieren Sie sie erneut. V. 5. Überprüfen Sie die Programmkompatibilität und versuchen Sie, als Administrator auszuführen. In den meisten Fällen in Ordnung

Der Fehlercode 30183-27 wird normalerweise durch unzureichende Berechtigungen oder Systemkonflikte verursacht. 1. Führen Sie den Installateur als Administrator aus und überprüfen Sie, ob die heruntergeladene Datei gesperrt ist. 2. Reinigen Sie die temporären Ordner des Systems (%temp%, temp, appdata \ local \ temp) und frei auf dem Speicherplatz frei. 3.. Schließen Sie vorübergehend die Antivirus -Software oder Firewall, um eine Störung der Installation zu verhindern. 4. Verwenden Sie die offiziellen Reparaturwerkzeuge von Microsoft wie Microsoft SupportAndRevery Assistant oder Office Deployment Tool (ODT), um zu beheben und zu installieren. 5. Versuchen Sie, den Computer vor der Installation neu zu starten. Befolgen Sie die obigen Schritte, um das Problem in den meisten Fällen zu lösen.

Windows -Update -Fehler 0x80070017 wird normalerweise durch Systemdateien, Caches oder Festplattenfehler verursacht und ist nicht unbedingt eine Festplattenkorruption. Die Lösung lautet wie folgt: 1. Verwenden Sie SFC- und DISM -Tools, um Systemdateien zu reparieren und SFC/Scannow- und DISM -Befehle nacheinander auszuführen. 2. Löschen Sie den Windows -Update -Cache und löschen Sie den SoftwaredIntribution -Ordnergehalt, nachdem Sie den Dienst gestoppt haben. 3. Führen Sie CHKDSK aus, um nach Festplattenfehlern zu überprüfen, die in der grafischen Schnittstelle oder Eingabeaufforderung ausgeführt werden können. 4.. Aktualisieren oder rollen Sie den Treiber, insbesondere den Speichercontroller und den Festplattenlaufwerk. In den meisten Fällen können die ersten drei Methoden gelöst werden. Wenn es immer noch nicht behandelt werden kann, kann es ein Hardwareproblem sein oder das System muss neu installiert werden.

Bei der Begegnung mit dem Fehler "thedataarAtedToasyStemCallistoosMall", 1. Erste Aktualisierung oder Neuinstallation des Netzwerkkartentreibers, können Sie die neueste Version über den Geräte -Manager aktualisieren oder manuell installieren. Virtuelle Maschinenbenutzer können versuchen, die virtuelle Netzwerkkarte zu löschen und neu zu nutzen. 2. Ändern Sie die Registrierung und passen Sie die LanmanworkStation -Parameter an, suchen Sie den angegebenen Pfad und setzen Sie die MemorySize auf 1048576 und fügen Sie FileInfocacheEntriesMax und FileObjectCacheEntriesMax hinzu, um den Cache zu optimieren. 3.. Überprüfen Sie LanmanworkStation, Server und TCP

CheckTHetRiggerSettingStoensuretheyareEnableDandCorctlyConfiguredWitHtherIltdate, Zeit, Andrecurrence; 2.VerifyTheAtionsettings, einschließlich correctProgram/scriptpathsandProperInterPreteruSage, speziellForscriptsusingPowerShell.exewithsandPolicyB

Die Gründe, warum der Telefonanruf keinen Ton gibt, sind: Hardwareprobleme (beschädigte Lautsprecher, blockierte Hörerlöcher, schlechte Anschlusskontakt), Softwareprobleme (Lautstärkeeinstellung zu niedrig, stillschweigender Modus, Systemfehler), Netzwerkprobleme (schwache Signalstärke, Netzwerkstau) und andere Gründe (Bluetooth -Kopfsets sind verbunden, Anwendungsstörungen). Zu den Lösungen gehören: Überprüfen der Hardware, das Anpassen der Lautstärkereinstellungen, das Ausschalten des stillen Modus, das Neustart des Telefons, das Aktualisieren des Systems, das Trennen des Bluetooth -Headsets und das Deinstallieren der problematischen Anwendung. Wenn es immer noch nicht gelöst werden kann, wenden Sie sich bitte an den technischen Support.