Ich möchte Go verwenden, um Aktienkurs-Tabellen von Yahoo Finance herunterzuladen. Ich werde eine HTTP-Anfrage für jeden Bestand in seiner eigenen Goroutine machen. Ich habe eine Liste von ungefähr 2500 Symbolen, aber anstatt 2500 Anfragen parallel zu machen, würde ich lieber 250 auf einmal machen. In Java würde ich einen Thread-Pool erstellen und Threads wiederverwenden, wenn sie frei werden. Ich habe versucht, etwas Ähnliches zu finden, einen Goroutine-Pool, wenn du willst, aber ich konnte keine Ressourcen finden. Ich würde mich freuen, wenn mir jemand sagen kann, wie ich die Aufgabe erledigen soll oder auf Ressourcen für das gleiche hinweisen soll. Vielen Dank!Wie man einen goroutin Pool verwendet
Antwort
Der einfachste Weg, ich nehme an, ist, 250 goroutines zu schaffen und ihnen einen Kanal zu übergeben, den Sie verwenden können, um Verbindungen von der Hauptgoroutine zu den Kindern zu führen, diesen Kanal hörend.
Wenn alle Links an goroutines übergeben werden, schließen Sie einen Kanal und alle goroutines beenden ihre Aufträge.
Um sich von der Hauptgoroutine zu sichern, bevor Kinder Daten verarbeiten, können Sie sync.WaitGroup
verwenden.
Hier einige Code zu veranschaulichen (nicht um eine endgültige Arbeitsversion, sondern zeigt den Punkt), dass ich sagte oben:
func worker(linkChan chan string, wg *sync.WaitGroup) {
// Decreasing internal counter for wait-group as soon as goroutine finishes
defer wg.Done()
for url := range linkChan {
// Analyze value and do the job here
}
}
func main() {
lCh := make(chan string)
wg := new(sync.WaitGroup)
// Adding routines to workgroup and running then
for i := 0; i < 250; i++ {
wg.Add(1)
go worker(lCh, wg)
}
// Processing all links by spreading them to `free` goroutines
for _, link := range yourLinksSlice {
lCh <- link
}
// Closing channel (waiting in goroutines won't continue any more)
close(lCh)
// Waiting for all goroutines to finish (otherwise they die as main routine dies)
wg.Wait()
}
Hier ist ein kleiner Test dieses Codes in Aktion: http://play.golang.org/p/fruJiGBWjn – Druska
Sie den Thread-Pool Implementierung Bibliothek in Go
von diesem git repo
verwenden können Here ist der schöne Blog darüber, wie die Kanäle als Thread-Pool verwenden
Snippet aus dem Blog
var (
MaxWorker = os.Getenv("MAX_WORKERS")
MaxQueue = os.Getenv("MAX_QUEUE")
)
//Job represents the job to be run
type Job struct {
Payload Payload
}
// A buffered channel that we can send work requests on.
var JobQueue chan Job
// Worker represents the worker that executes the job
type Worker struct {
WorkerPool chan chan Job
JobChannel chan Job
quit chan bool
}
func NewWorker(workerPool chan chan Job) Worker {
return Worker{
WorkerPool: workerPool,
JobChannel: make(chan Job),
quit: make(chan bool)}
}
// Start method starts the run loop for the worker, listening for a quit channel in
// case we need to stop it
func (w Worker) Start() {
go func() {
for {
// register the current worker into the worker queue.
w.WorkerPool <- w.JobChannel
select {
case job := <-w.JobChannel:
// we have received a work request.
if err := job.Payload.UploadToS3(); err != nil {
log.Errorf("Error uploading to S3: %s", err.Error())
}
case <-w.quit:
// we have received a signal to stop
return
}
}
}()
}
// Stop signals the worker to stop listening for work requests.
func (w Worker) Stop() {
go func() {
w.quit <- true
}()
}
- 1. (Wie) Verwendet TPL (CLR) Thread Pool?
- 2. Wie konfiguriert man einen fein abgestimmten Thread-Pool für Futures?
- 3. Wie man einen Thread-Pool für Schauspieler festlegen
- 4. Wie ändert man CLR-Thread-Pool-Konfigurationen?
- 5. Wie Application Pool mit MSDeploy
- 6. Wie kann ich einen Fork-Pool in Perl verwalten?
- 7. Wie deklarieren und verwenden Sie einen überladenen Pool-Operator löschen?
- 8. Wie behandelt man Grenzen in Conv/Pool von Conv-Netzen?
- 9. Wie verwendet man .Foreground?
- 10. Wie verwendet man SQLiteDatabase.CursorFactory
- 11. Wie man Typlisten verwendet
- 12. String Pool vs Konstante Pool
- 13. Wie funktioniert Jedis Pool?
- 14. Wie tötet man alle Pool-Mitarbeiter im Multiprozess?
- 15. Wie verwendet man BeanUtils.copyProperties?
- 16. Wie verwendet man TrueForAll
- 17. Django Datenbankverbindungen pool mit psycopg2.pool
- 18. google caja wie man verwendet
- 19. Wie transformiert man einen WebService-Aufruf, der Verhalten verwendet?
- 20. Wie verwendet man einen zurückgegebenen Funktionswert als Bedingung?
- 21. Wie man MarkerClusterer - Schritt-für-Schritt für einen Neuling verwendet
- 22. Wie man mehr als einen Ausdruck in einer Reihe verwendet
- 23. Wie verwendet man regulären Ausdruck, um einen Teilzeichenfolgewert zu ersetzen?
- 24. C#: Wie man einen Typkonverter verwendet, um enums zu lokalisieren
- 25. Wie verwendet man einen Punkt in Python-Formatzeichenfolgen?
- 26. Wie verwendet man einen Funktionszeiger, der Mitglied einer Struktur ist
- 27. Wie erstellt man einen Nerdtree-Knoten, der tmpl.html verwendet
- 28. Wie verwendet man jQuery, um einen nicht-modalen Dialog anzuzeigen?
- 29. Wie erstellt und verwendet man einen benutzerdefinierten IFormatProvider für DateTime?
- 30. Wie überprüft man, ob WebRTC einen Relay Server verwendet?
Brauchen Sie diese Gououtines in einem Pool? Sie behandeln sie wie Ressourcen, die Sie erstellen und wiederverwenden. Oder, würden Sie eine einfachere Lösung in Erwägung ziehen, bei der die Göroutines wegwerfbar sind, aber Sie nur kontrollieren, wie viele von ihnen gleichzeitig laufen? – atedja