Channel-Based Queue
Kanal asosidagi navbat
Fabrikadagi konveyer lentasini tasavvur qiling: ishchilar mahsulotni lentaga qo'yadi, boshqa ishchilar esa lentaning narigi uchidan ularni OLIB, ishlov beradi — ikkalasi ham bir vaqtda, bir-biriga to'sqinlik qilmasdan ishlaydi. Go'ning kanali (chan) — aynan shunday "konveyer lenta": "Channels & Select" darsida ko'rganingizdek, kanal orqali goroutine'lar bir-biriga XAVFSIZ ma'lumot uzatadi.
package main
import "fmt"
type Task struct {
ID string
Payload string
}
// TaskQueue — kanal ustidan qurilgan oddiy o'ram (wrapper)
type TaskQueue struct {
tasks chan *Task
}
func NewTaskQueue(capacity int) *TaskQueue {
return &TaskQueue{tasks: make(chan *Task, capacity)}
}
func (q *TaskQueue) Enqueue(task *Task) {
q.tasks <- task
}
func (q *TaskQueue) Dequeue() *Task {
return <-q.tasks
}
func main() {
queue := NewTaskQueue(10)
queue.Enqueue(&Task{ID: "task-1", Payload: "email"})
queue.Enqueue(&Task{ID: "task-2", Payload: "hisobot"})
first := queue.Dequeue()
fmt.Println(first.ID, first.Payload)
}make(chan *Task, capacity) — buferlangan kanal ("Buffered vs Unbuffered Channels" darsini eslang): capacity gacha vazifa, hech kim uni DARHOL olmasa ham, kanal ICHIDA kutishi mumkin. Bu — navbat (queue) g'oyasining aynan o'zi: vazifalar KELISH tartibida saqlanadi (FIFO — "birinchi kirgan, birinchi chiqadi"), va worker'lar ularni shu tartibda oladi.
Enqueue (q.tasks <- task) — kanalga yuborish, Dequeue (<-q.tasks) — kanaldan olish. Agar buffer TO'LIQ bo'lsa, Enqueue navbatda BO'SH joy paydo bo'lguncha KUTADI (bloklanadi); agar kanal BO'SH bo'lsa, Dequeue yangi vazifa kelguncha KUTADI. Bu — "Producer-Consumer Pattern" darsida ko'rgan naqshning aynan o'zi.
>_ Exercise
TaskQueue'ga navbatdagi vazifalar sonini bilish imkonini qo'shing.
- •Len() int metodini yozing: len(q.tasks) qaytaring
- •Ikkita vazifani Enqueue qiling, so'ng Len()ni chop eting
- •Bitta vazifani Dequeue qiling, so'ng Len()ni yana chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Buferlangan kanal — Go'da navbat (FIFO queue) qurishning eng tabiiy usuli: Enqueue va Dequeue mos ravishda kanalga yuborish va undan olishga aylanadi, sinxronizatsiya esa kanalning o'zi tomonidan ta'minlanadi.
NEXT UP
Worker Implementation
$ go run main.go
Kodingizni ishga tushiring