前提・実現したいこと
現在、Golangを使ってGIS系の沢山の人間や自動車が動き回るシミュレータを作成しております。
具体的にはgoroutineの中でstructで定義したオブジェクトを大量に発生させて、それらをバラバラに動かすことを考えております。
時々、そのすべてのgoroutineの中のオブジェクトに対して、main()より指示を出したいと思っています(例えば、『現在の位置情報を私(main())に教えろ』というようなもの)。
そこで、単一のchannelを使ったブロードキャストのようなことを試みたいと思っています。
複数のgoroutineに同時に指示が出せるのであれば、手段は問いません。
何卒ご教示頂けますよう、よろしくお願い申し上げます。
発生している問題・エラーメッセージ
これについては、(下記のコードのように)goroutineの数だけchannelを作れば実現可能であることは分かったのですが、問題点が2つほどあります。 (1)作成するgoroutineの数が大きいこと(数千から数万) (2)goroutineは不定期に発生して、(役目を終えたら)自動的に消滅する(させる) となっております。
該当のソースコード
main.go
1package main 2 3import ( 4 "fmt" 5 "sync" 6 "time" 7) 8 9type BUS struct { 10 number int 11} 12 13func bus_func(i int, wg *sync.WaitGroup, ch1 chan int, ch2 chan int) { 14 defer wg.Done() 15 16 t := time.NewTicker(1 * time.Second) // 1秒おきに通知 17 18 bus := BUS{} 19 bus.number = i 20 21 pointer_bus := &bus 22 23 fmt.Println(pointer_bus) 24 25 // 待受 26 for { 27 select { 28 case v := <-ch1: // 受信 29 if v == -1 { //終了コードの受信 30 return // スレッドを自滅させる 31 } else { 32 fmt.Println(v) 33 } 34 case <-t.C: // 送信 (1秒まったら、むりやりこっちにくる) 35 ch2 <- i + 100 36 } 37 } 38 39} 40 41//var c = make([]chan int, 3) // 間違い 42// var c []chan int これは実行時にエラーとなる 43 44var c1 [3]chan int // チャネルをグローバル変数で置く方法の、現時点での正解 45var c2 [3]chan int // チャネルをグローバル変数で置く方法の、現時点での正解 46 47func main() { 48 var wg sync.WaitGroup 49 defer wg.Wait() 50 51 //c := make(chan int) 52 53 // バスエージェントの生成 3台 54 for i := 0; i < 3; i++ { 55 wg.Add(1) 56 57 c1[i] = make(chan int) 58 c2[i] = make(chan int) 59 go bus_func(i, &wg, c1[i], c2[i]) 60 } 61 62 // バスエージェントにメッセージを送る 63 64 c1[0] <- 50 65 c1[1] <- 30 66 c1[2] <- 10 67 68 c1[0] <- 50 69 c1[1] <- 30 70 c1[2] <- 10 71 72 c1[0] <- 50 73 c1[1] <- 30 74 c1[2] <- 10 75 76 fmt.Println(<-c2[0]) 77 fmt.Println(<-c2[1]) 78 fmt.Println(<-c2[2]) 79 80 c1[0] <- -1 // スレッド終了コードの送信 81 c1[1] <- -1 // スレッド終了コードの送信 82 c1[2] <- -1 // スレッド終了コードの送信 83 84} 85
試したこと
上記に記載するサンプルプログラムでは、発生させたgoroutineとの間で個別にchannelを作る必要があり、goroutineの管理(発生から消滅まで)をしなければなりません。
(当初、『これくらいのことは簡単に見つかるだろう』と思っていたのですが、昨日1日かけて発見することができませんでした)
補足情報(FW/ツールのバージョンなど)
go version go1.17 windows/amd64
![guest](/img/icon/icnUserSample.jpg)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/25 01:34