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.
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|