2017-11-17 3 views
0

Ich schreibe eine App, die es Benutzern ermöglicht, Dateien hochzuladen und sie zur Verarbeitung in die Warteschlange zu stellen. Meine Vorgehensweise besteht darin, eine Goroutine für die Verarbeitung hochgeladener Dateien zu erstellen und einen Kanal zu verwenden, um zu signalisieren, dass eine neue Datei für die Verarbeitung bereit ist.Korrekte Möglichkeit, Elemente für eine Worker Goroutine einzuordnen?

Grundsätzlich funktioniert die Verarbeitung goroutine dies:

for { 
    while itemForProcessing() { 
     processNextItem() 
    } 
    select { 
    case <-signalChan: 
    case <-stopChan: 
     return 
    } 
} 

Der Code zur Signalisierung, dass ein neues Element für die Verarbeitung bereit ist, etwas wie folgt aussieht:

select { 
case signalChan <- true: 
default: 
} 

Beachten Sie, dass dies ein nicht ist blockieren senden auf dem Kanal.

Es gibt drei mögliche Szenarien:

  • die Verarbeitung goroutine im select{} Block — der erste Fall ausgeführt wird und der nächste Punkt ist
  • die Verarbeitung goroutine verarbeitet wird processNextItem() — der nächste Punkt der Ausführung wird einmal verarbeitet processNextItem() kehrt zurück, da die Schleife Bedingung wird true
  • die Verarbeitungsgoroutine hat die Schleife verlassen hat aber noch nicht eingegeben select{} Block

Das letzte Szenario wird zu einem Problem führen. Das nicht blockierende Senden sendet nichts auf dem Kanal, und die Goroutine wartet im Block select{}, bis etwas anderes passiert.

Wie kann ich dieses Problem vermeiden? Ich kann einen blockierenden Sendevorgang nicht verwenden, da die Verarbeitungsgou- routine möglicherweise processNextItem() ausgeführt wird, wodurch der Sendevorgang extrem lange blockiert wird.

+0

Hier Kanal arbeitet als aktualisierbare Flagge - Signal gibt es etwas, was App lesen kann. Ich denke, es gibt eine Möglichkeit, Dinge zu vereinfachen - übergeben Sie einfach neue Objekte, die über den Kanal behandelt werden sollen. Dies löst mehrere Probleme: einfache Parallelität, Schutz der Rennbedingungen, Vereinfachung. –

Antwort

2

ein verlorenes Signal zu vermeiden, verwenden Sie einen Kanal mit einer Kapazität 1.

+0

Danke! Dies wird hervorragend funktionieren. –

Verwandte Themen