Push ve pop işlevlerine sahip bir kuyruk yapısını yapmaya çalışıyorum.Golang'ın goroutini kullanırken nasıl bir sayaç uygulanır?
Aşağıdaki kodda yaptığım gibi 10 iş parçacığı push ve diğer 10 iş parçacığı pop verisini kullanmalıyım.
Sorular: 1. Ne kadar ittiğimi/attığımı yazdırmam gerekiyor, ancak bunu nasıl yapacağımı bilmiyorum. 2. Kodumu hızlandırmak için zaten var mı? kod benim için çok yavaş.
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
}
}
Teşekkürler @jimt, ama tam olarak ne demek istediğini anlamadım ** Kuyruk tipi işaretçi alıcıları olmalı **, bana golang'ın dokümanı hakkında bir link verebilir misiniz? Ben bulamıyorum, tekrar teşekkürler. – MrROY
@MrROY: Effective Go'nun bu bölümü şu farkı tartışıyor: http://golang.org/doc/effective_go.html#pointers_vs_values. Esas olarak, eğer alıcı (T) ise, yönteminiz çağrılan nesnenin bir kopyasını * alır ve bu nedenle değiştiremez. Alıcı (* T) ise, ona bir işaretçi alır. –
Go-rutines sayısının derleme zamanında kesin olarak bilinmediği durumlarda, oluşturulan her bir üründe b wg.Add (1) ' ' defer.wg.Done() 'ı çağırmamanız için herhangi bir neden var mı? – matthias