Skip to content

Instantly share code, notes, and snippets.

@mche
Last active November 3, 2022 06:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mche/ce64c83df2bb7633112ab8a00ed89c37 to your computer and use it in GitHub Desktop.
Save mche/ce64c83df2bb7633112ab8a00ed89c37 to your computer and use it in GitHub Desktop.
Короч, маленький пример обработки очереди
package main
import (
"log"
"time"
)
const (
queueLimit = 5
taskLimit = 20
)
var (
taskChan = make(chan *taskStruct)
currentWorkers = queueLimit
)
type taskStruct struct {
id int
action func() int
result chan(int) // можно будет получить результат когда будет готов
}
func main() {
for id := 0; id < queueLimit; id++ {
go worker(id)
}
// цикл пока не закроют close(taskChan)
for doneTask := range taskChan {
log.Printf("doneTask[%v] with result %+v", doneTask.id, <- doneTask.result) // тут будет блокироваться ожидая результат
}
}
func worker(id int) {
task := getTask(id)
if task == nil {
currentWorkers--
if currentWorkers == 0 {
close(taskChan)
}
return
}
// попробуй раскомментить и закоммментить ниже
//taskChan <- task
task.actionTask()
taskChan <- task
worker(id + queueLimit)
}
func getTask(id int) *taskStruct {
if id >= taskLimit {
return nil
}
log.Printf("New task %v", id)
return &taskStruct{
id: id,
action: func() int {
t := id % queueLimit + 1
time.Sleep(time.Duration(t) * time.Second)
return t
},
result: make(chan int, 1),
}
}
func (task *taskStruct) actionTask(){
// некоторые таски халявят, не хотят выполняться (или берут значения из кэша)
if task.id % queueLimit == 0 {
task.result <- 0
return
}
res := task.action()
task.result <- res
///log.Printf("actionTask[%v] has sleep %v", task.id, res)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment