]> 127.0.0.1 Git - part/.git/commitdiff
96
authorqydysky <qydysky@foxmail.com>
Tue, 22 Dec 2020 12:33:33 +0000 (20:33 +0800)
committerqydysky <qydysky@foxmail.com>
Tue, 22 Dec 2020 12:33:33 +0000 (20:33 +0800)
msgq/Msgq.go
msgq/Msgq_test.go

index 413cc41d63b5b6b432044a59dc9c0d128077f045..aaab7b3538d5c20a40ec86959611c041539400a3 100644 (file)
@@ -74,4 +74,35 @@ func (m *msgq) Sig() (sig uint64) {
 func (m *msgq) get_sig() (sig uint64) {
        m.sig += 1
        return m.sig
+}
+
+type msgq_tag_data struct {
+       Tag string
+       Data interface{}
+}
+
+func (m *msgq) Push_tag(Tag string,Data interface{}) {
+       m.Push(msgq_tag_data{
+               Tag:Tag,
+               Data:Data,
+       })
+}
+
+func (m *msgq) Pull_tag(func_map map[string]func(interface{})(bool)) {
+       go func(){
+               var (
+                       sig = m.Sig()
+                       data interface{}
+               )
+               for {
+                       data,sig = m.Pull(sig)
+                       if d,ok := data.(msgq_tag_data);!ok {
+                               continue
+                       } else {
+                               if f,ok := func_map[d.Tag];ok{
+                                       if f(d.Data) {break}
+                               }
+                       }
+               }
+       }()
 }
\ No newline at end of file
index c918d233569a50153eb7098c51f802db242d5c73..a753f6dfe4a91b422ef3d7858221e0e2f67fc165 100644 (file)
@@ -105,3 +105,43 @@ func Test_msgq2(t *testing.T) {
        }
        t.Log(`fin`)
 }
+
+func Test_msgq3(t *testing.T) {
+       mq := New(5)
+
+       mun_c := make(chan bool,100)
+       mq.Pull_tag(map[string]func(interface{})(bool){
+               `A1`:func(data interface{})(bool){
+                       if v,ok := data.(string);!ok || v != `a11`{t.Error(`1`)}
+                       mun_c <- true
+                       return false
+               },
+       })
+       mq.Pull_tag(map[string]func(interface{})(bool){
+               `A1`:func(data interface{})(bool){
+                       if v,ok := data.(string);!ok || v != `a11`{t.Error(`2`)}
+                       mun_c <- true
+                       return false
+               },
+       })
+       mq.Pull_tag(map[string]func(interface{})(bool){
+               `A1`:func(data interface{})(bool){
+                       if v,ok := data.(string);!ok || v != `a11`{t.Error(`3`)}
+                       mun_c <- true
+                       return false
+               },
+       })
+
+       var fin_turn = 0
+       t.Log(`start`)
+       time.Sleep(time.Second)
+       for fin_turn < 1000000 {
+               mq.Push_tag(`A1`,`a11`)
+               <-mun_c
+               <-mun_c
+               <-mun_c
+               fin_turn += 1
+               fmt.Print("\r",fin_turn)
+       }
+       t.Log(`fin`)
+}