Я использую this как concurrentmap и буферные каналы в качестве значения карты для потокобезопасности (работает как очередь), когда тест использует 10 goroutines, значение, полученное от канала, было не таким же один отправить, любое предложение?golang thread safe map с каналом как значения для потокобезопасности
package main
import "fmt"
import "github.com/streamrail/concurrent-map"
func main() {
testmap := cmap.New()
fmt.Println("SyncMapNew: ", TestInParallel(&testmap, 10))
}
func TestInParallel(g *cmap.ConcurrentMap, n int) time.Duration {
start := time.Now()
var wait sync.WaitGroup
for i := 0; i < n; i++ {
wait.Add(1)
go func() {
TheTest(g, rand.New(rand.NewSource(int64(i*500))))
wait.Done()
}()
}
wait.Wait()
return time.Now().Sub(start)
}
func TheTest(g *cmap.ConcurrentMap, rnd *rand.Rand) time.Duration {
start := time.Now()
var key string
var value time.Time
for i := 0; i < 10000; i++ {
key = strconv.Itoa(int(rnd.Int31n(50000)))
if g.Has(key) == false {
g.Set(key, make(chan time.Time, 100))
}
tchan, _ := g.Get(key)
castchan := tchan.(chan time.Time)
value = time.Now()
castchan <- value
got := <-castchan
g.Set(key, castchan)
if value != got {
panic(fmt.Sprintf("ERROR: expected %v, got %v", value, got))
}
}
return time.Now().Sub(start)
}
обновление я неправильно понять бизнес-логику, код должен нравится этот
key = strconv.Itoa(int(rnd.Int31n(500)))
tchan, _ := g.GetSet(key, make(chan time.Time, 100))
castchan := tchan.(chan time.Time)
value = time.Now()
if len(castchan) >= 99 {
<-castchan//do somthing here
}
castchan <- value
g.Set(key, castchan)
http://play.golang.org/p/RqxEjTei2e – sdhjl2000
Учитывая недостатки в пакете «concurent-map», который вы используете (некоторые из них упоминаются в [ответе Дэвида Будворта] (http://stackoverflow.com/) a/30339509/55504), есть больше), и вы легко можете добавить 'sync.Mutex', который блокирует то, что вам действительно нужно (что часто немного больше, чем отдельные обращения к карте). Я не вижу причин использовать пакет. –