infra
/
goutils
Archived
1
0
Fork 0
This repository has been archived on 2022-04-06. You can view files and clone it, but cannot push or open issues or pull requests.
goutils/async/iface_queue.go

37 lines
698 B
Go
Raw Normal View History

2018-06-09 12:58:26 +09:00
package async
2018-06-06 15:30:23 +09:00
import (
"container/list"
)
2018-06-09 12:31:21 +09:00
// 블럭되지 않는 큐체널
2018-06-09 12:58:26 +09:00
func NewQueue() (chan<- interface{}, <-chan interface{}) {
send := make(chan interface{}, 1)
receive := make(chan interface{}, 1)
go manageQueue(send, receive)
2018-06-06 15:30:23 +09:00
return send, receive
}
2018-06-09 12:58:26 +09:00
func manageQueue(send <-chan interface{}, receive chan<- interface{}) {
2018-06-06 15:30:23 +09:00
queue := list.New()
2018-06-09 12:31:21 +09:00
defer close(receive)
2018-06-06 15:30:23 +09:00
for {
if front := queue.Front(); front == nil {
2018-06-09 12:31:21 +09:00
if value, ok := <-send; ok {
queue.PushBack(value)
} else {
break
2018-06-06 15:30:23 +09:00
}
} else {
select {
2018-06-09 12:58:26 +09:00
case receive <- front.Value.(interface{}):
2018-06-06 15:30:23 +09:00
queue.Remove(front)
case value, ok := <-send:
if ok {
queue.PushBack(value)
}
}
}
}
}