Ich versuche, eine Warteschlange Struktur, die Push-und Pop-Funktionen haben.Wie implementiert man einen Zähler bei der Verwendung der Golou-Goroutine?
Ich brauche 10 Threads Push und weitere 10 Threads Pop-Daten, genau wie ich es im Code unten getan habe.
Fragen: 1. Ich muss ausdrucken, wie viel ich gedrückt habe, aber ich weiß nicht, wie das geht. 2. Gibt es trotzdem eine Beschleunigung meines Codes? Der Code ist zu langsam für mich.
package main
import (
"runtime"
"time"
)
const (
DATA_SIZE_PER_THREAD = 10000000
)
type Queue struct {
records string
}
func (self Queue) push(record chan interface{}) {
// need push counter
record <- time.Now()
}
func (self Queue) pop(record chan interface{}) {
// need pop counter
<- record
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
//record chan
record := make(chan interface{},1000000)
//finish flag chan
finish := make(chan bool)
queue := new(Queue)
for i:=0; i<10; i++ {
go func() {
for j:=0; j<DATA_SIZE_PER_THREAD; j++ {
queue.push(record)
}
finish<-true
}()
}
for i:=0; i<10; i++ {
go func() {
for j:=0; j<DATA_SIZE_PER_THREAD; j++ {
queue.pop(record)
}
finish<-true
}()
}
for i:=0; i<20; i++ {
<-finish
}
}
Danke @jimt, aber ich bin nicht ganz zu verstehen, was du meinst ** der Queue-Typ sollte Zeiger Empfänger haben **, könnten Sie mir einen Link auf Golang Doc? Ich kann keine finden, Danke nochmal. – MrROY
@MrROY: Dieser Abschnitt von Effective Go behandelt den Unterschied: http://golang.org/doc/effective_go.html#pointers_vs_values. Im Wesentlichen, wenn der Empfänger (T) ist, erhält Ihre Methode eine * Kopie * des Objekts, von dem sie aufgerufen wird, und kann sie daher nicht ändern. Wenn der Empfänger (* T) ist, erhält er einen Zeiger darauf. –
In Fällen, in denen die Anzahl der Go-Routinen zur Kompilierzeit nicht genau bekannt ist, gibt es einen Grund, in jeder erstellten Goroutine keinen 'wg.Add (1)' 'defer.wg.Done()' aufzurufen? – matthias