Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen

Überblick

Dies ist mein erster und zweiter Beitrag als Ingenieur. Ich hatte die Gelegenheit, einen exklusiven Kontrollmechanismus in Go zu schreiben, also werde ich ihn aufzeichnen. Dieses Mal werden wir einen exklusiven Kontrollmechanismus mit zwei Methoden erstellen.

Verschiedene Werkzeuge

Szenario

Dieses Mal wird unter Verwendung einer bestimmten Tabelle als gemeinsam genutzte Ressource bei der Verarbeitung der Tabelle aus mehreren Prozessen ein Mechanismus erstellt, der verhindert, dass nachfolgende Prozesse die Tabelle betreiben, bis der vorherige Prozess abgeschlossen ist. Ich werde fortsetzen.

Versuchen Sie zunächst, die Tabelle gleichzeitig mit der Goroutine zu aktualisieren, ohne eine ausschließliche Kontrolle durchzuführen. (sync.WaitGroup dient zum Warten auf die Haupt-Goroutine. Weitere Informationen hier.)

var w sync.WaitGroup

func main() {
	w.Add(2)
	go update()
	go update()
	w.Wait()
}

func update() {
	defer w.Done()
	for i := 0; i <= 10; i += 5 {
		fmt.Println("tbl update:", i*10, "%")
		time.Sleep(time.Second)
	}
}

// tbl update: 0 %
// tbl update: 0 %
// tbl update: 50 %
// tbl update: 50 %
// tbl update: 100 %
// tbl update: 100 %

Sie können sehen, dass die beiden Prozesse die Tabelle gleichzeitig aktualisieren. Dieses Mal erstellen wir einen Mechanismus, um die folgende Ausgabe zu erhalten, sodass die nachfolgende Aktualisierung nach Abschluss der vorherigen Aktualisierung durchgeführt wird.

// tbl update: 0 %
// tbl update: 50 %
// tbl update: 100 %
// tbl update: 0 %
// tbl update: 50 %
// tbl update: 100 %

Muster mit sync.Mutex

Zunächst von sync.Mutex.

//Die Hauptfunktion ist die gleiche wie oben

var m sync.Mutex

func update() {
	defer w.Done()
	defer m.Unlock()
	m.Lock()
	for i := 0; i <= 10; i += 5 {
		fmt.Println("tbl update:", i*10, "%")
		time.Sleep(time.Second)
	}
}
// tbl update: 0 %
// tbl update: 50 %
// tbl update: 100 %
// tbl update: 0 %
// tbl update: 50 %
// tbl update: 100 %

Deklarieren Sie "UnLock ()" und "Lock ()" zu Beginn von "update ()". Nachfolgende Goroutinen können "Lock ()" erst anwenden, wenn die vorhergehenden Goroutinen "UnLock ()" (bis die Verarbeitung der Funktion abgeschlossen ist) sind. Infolgedessen warten sie, bis die Verarbeitung der vorhergehenden Goroutinen abgeschlossen ist. Sie können sehen, dass die Ausgabe wie beabsichtigt ist.

sync.Mutex ist sehr einfach und unkompliziert, führt jedoch nur einen Prozess aus. Es unterscheidet sich ein wenig von diesem Szenario, aber es scheint schwierig zu sein, einen Mechanismus wie "um die Belastung des Servers zu verringern und zu verhindern, dass mehr als 1000 Prozesse gleichzeitig ausgeführt werden" zu erstellen.

Muster mit Semapho

Da ich zum ersten Mal ein Semapho benutze, werde ich darüber schreiben, was ein Semafo ist.

Was ist Semafo?

Semafo ist einer der exklusiven Kontrollmechanismen und modelliert den Betrieb von Eisenbahnstrecken. (Semaphor bedeutet auf Japanisch Signal) Es wurde erstellt, um die gemeinsam genutzte Ressource von Zeilen so zu steuern, dass sie nicht gleichzeitig verwendet werden. Ein Semapho besteht aus drei Semaphovariablen, einer P-Operation und einer V-Operation.

Dieses Szenario ist ein binäres Semapho, und es scheint notwendig zu sein, die P-Operation zu Beginn der "update ()" - und die V-Operation am Ende auszuführen.

Implementierung

golang.org/x/syncを使って実装します。


const semaphoreCnt = 1

var s *semaphore.Weighted = semaphore.NewWeighted(semaphoreCnt)

func update() {
	defer w.Done()
	defer s.Release(1)           //V-Betrieb Erhöhen Sie die Semapho-Variable um 1.
	s.Acquire(context.TODO(), 1) //P-Operation: Verringern Sie die Semaphovariable um 1.
	for i := 0; i <= 10; i += 5 {
		fmt.Println("tbl update:", i*10, "%")
		time.Sleep(time.Second)
	}
}
// tbl update: 0 %
// tbl update: 50 %
// tbl update: 100 %
// tbl update: 0 %
// tbl update: 50 %
// tbl update: 100 %

golang.org/x/syncAcquire()がP操作に,Release()がV操作にあたります。 Die exklusive Steuerung wird realisiert, indem eine Semaphovariable mit "semaphore.Weighted" definiert und mit "Acquire ()" und "Release ()" erhöht oder verringert wird.

また、golang.org/x/syncでは、Acquire(),Release()でセマフォ変数をいくつ増減させるかを調節することが出来ます。(今回は2値セマフォのため、それぞれ1増減となっています。) Auf diese Weise können Sie die Verarbeitungsgewichte für jeden Prozess definieren.

golang.org/x/syncを使うことでsync.Mutexと比べ、より複雑な排他制御の仕組みを作ることができます。

Referenz

Recommended Posts

Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe eine einfache Mail-Sendeanwendung mit tkinter von Python erstellt
Ich habe eine Burgsuch-API mit Elasticsearch + Sudachi + Go + Echo erstellt
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Ich habe eine Web-API erstellt
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht, mit Python einen regulären Ausdruck von "Datum" zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[4.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
[1.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich möchte ein Spiel mit Python machen
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Ich habe versucht, einen URL-Verkürzungsdienst mit AWS CDK serverlos zu machen
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich habe versucht, einen periodischen Prozess mit CentOS7, Selenium, Python und Chrome durchzuführen
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Als ich versuchte, eine VPC mit AWS CDK zu erstellen, konnte ich es aber nicht schaffen
[Patentanalyse] Ich habe versucht, mit Python eine Patentkarte zu erstellen, ohne Geld auszugeben
[Go + Gin] Ich habe versucht, eine Docker-Umgebung zu erstellen
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe versucht, eine einfache Bilderkennungs-API mit Fast API und Tensorflow zu erstellen
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Ich habe versucht, mit Python Machine Learning ein Echtzeit-Modell zur Trennung von Tonquellen zu erstellen
[Python] Ich habe versucht, automatisch einen täglichen Bericht über YWT mit Outlook-Mail zu erstellen
Ich habe versucht, mit AI kreative Kunst zu machen! Ich habe eine Neuheit programmiert! (Artikel: Creative Adversarial Network)
Ich habe versucht, mit Quantx eine Linie mit gleitendem Durchschnitt des Volumens zu implementieren
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, automatisch einen Bericht mit der Markov-Kette zu erstellen
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich habe versucht, das Problem der Kombinationsoptimierung mit Qiskit zu lösen
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
Ich habe versucht, mit Hy ・ Define a class zu beginnen
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, eine zufällige FizzBuzz-Spalte mit Blasensortierung zu sortieren.
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe versucht, in einem tief erlernten Sprachmodell zu schreiben
Ich habe mit PyQt einen einfachen Texteditor erstellt
Ich habe eine Funktion zum Abrufen von Daten aus der Datenbank spaltenweise mithilfe von SQL mit SQLite3 von Python [SQLite3, SQL, Pandas] erstellt.
[1 Stunde Herausforderung] Ich habe versucht, eine Wahrsagerseite zu erstellen, die für Python zu geeignet ist