Comments 6
Реально сразу рабочий вариант выдавали? Что-то мне наверное не везет с этими llm, сразу рабочий вариант не выдают. (локально разные ollama и yandexgpt 4 pro в облаке).
YandexGPT API Для реализации worker pool с приоритетами на языке Go, можно использовать горутины и каналы. Вот пример такой реализации
package main
import (
"sync"
)
// Задача представляет собой структуру, которая содержит данные и приоритет.
type Task struct {
Data string
Priority int
}
// WorkerPool представляет пул воркеров, которые обрабатывают задачи.
type WorkerPool struct {
workers int
taskChan chan *Task
doneChan chan bool
wg sync.WaitGroup
priorityHighTasks []Task // Задачи с высоким приоритетом
}
// NewWorkerPool создаёт новый пул воркеров с заданным количеством воркеров и размером канала для задач.
func NewWorkerPool(workers int, taskChanSize int) *WorkerPool {
return &WorkerPool{
workers: workers,
taskChan: make(chan *Task, taskChanSize),
doneChan: make(chan bool),
priorityHighTasks: []Task{},
}
}
// AddTask добавляет задачу в очередь задач.
func (wp *WorkerPool) AddTask(task *Task) {
wp.taskChan <- task
}
// Start запускает пул воркеров.
func (wp *WorkerPool) Start() {
for i := 0; i < wp.workers; i++ {
go func() {
for task := range wp.taskChan {
if task.Priority == HighPriority {
wp.priorityHighTasks = append(wp.priorityHighTasks, *task)
} else {
// Обработка задач с низким приоритетом
}
}
}()
}
go func() {
for range wp.priorityHighTasks {
wp.doneChan <- true
}
}()
}
// Wait ждёт завершения всех задач.
func (wp *WorkerPool) Wait() {
close(wp.taskChan)
wp.wg.Wait()
<-wp.doneChan
}
const (
HighPriority = 1
LowPriority = 0
)
func main() {
// Создание пула воркеров с 4 воркерами и каналом для задач размером 100
pool := NewWorkerPool(4, 100)
// Добавление задач
tasks := []Task{
{Data: "Задача 1", Priority: HighPriority},
{Data: "Задача 2", Priority: LowPriority},
{Data: "Задача 3", Priority: HighPriority},
}
for _, task := range tasks {
pool.AddTask(&task)
}
// Запуск пула воркеров
pool.Start()
// Ожидание завершения всех задач
pool.Wait()
}
Реализация от YandexGPT выглядит действительно странно и гарантированно ловит дедлок.
Реально сразу рабочий вариант выдавали?
Да, все варианты реализаций были сгенерированны один и первым запросом, для каждого запроса открывался новый чат. Можете попробовать отправить такой же промпт в DeepSeek R1, пока он бесплатный.
Проверил на DeepSeek и выдало сразу запускаемый код, только он отличается от того что в статье
Скрытый текст
package main
import (
"fmt"
"sync"
"time"
)
// Priority определяет приоритет задачи
type Priority int
const (
HighPriority Priority = iota
LowPriority
)
// Job представляет задачу, которую нужно выполнить
type Job struct {
ID int
Priority Priority
Task func()
}
// WorkerPool представляет пул воркеров
type WorkerPool struct {
highPriorityJobs chan Job
lowPriorityJobs chan Job
wg sync.WaitGroup
}
// NewWorkerPool создает новый пул воркеров
func NewWorkerPool(numWorkers int, queueSize int) *WorkerPool {
wp := &WorkerPool{
highPriorityJobs: make(chan Job, queueSize),
lowPriorityJobs: make(chan Job, queueSize),
}
for i := 0; i < numWorkers; i++ {
wp.wg.Add(1)
go wp.worker()
}
return wp
}
// worker обрабатывает задачи из каналов с приоритетами
func (wp *WorkerPool) worker() {
defer wp.wg.Done()
for {
select {
case job, ok := <-wp.highPriorityJobs:
if !ok {
// Канал highPriorityJobs закрыт, проверяем lowPriorityJobs
select {
case job, ok := <-wp.lowPriorityJobs:
if !ok {
// Оба канала закрыты, завершаем работу
return
}
job.Task()
default:
// Нет задач в lowPriorityJobs, завершаем работу
return
}
} else {
job.Task()
}
case job, ok := <-wp.lowPriorityJobs:
if !ok {
// Канал lowPriorityJobs закрыт, проверяем highPriorityJobs
select {
case job, ok := <-wp.highPriorityJobs:
if !ok {
// Оба канала закрыты, завершаем работу
return
}
job.Task()
default:
// Нет задач в highPriorityJobs, завершаем работу
return
}
} else {
job.Task()
}
}
}
}
// AddJob добавляет задачу в соответствующий канал в зависимости от приоритета
func (wp *WorkerPool) AddJob(job Job) {
switch job.Priority {
case HighPriority:
wp.highPriorityJobs <- job
case LowPriority:
wp.lowPriorityJobs <- job
}
}
// Stop завершает работу пула воркеров, гарантируя обработку всех задач с высоким приоритетом
func (wp *WorkerPool) Stop() {
close(wp.highPriorityJobs)
wp.wg.Wait()
close(wp.lowPriorityJobs)
}
func main() {
// Создаем пул воркеров с 3 воркерами и размером очереди 10
wp := NewWorkerPool(3, 10)
// Добавляем задачи с разными приоритетами
for i := 1; i <= 5; i++ {
wp.AddJob(Job{
ID: i,
Priority: LowPriority,
Task: func() {
fmt.Printf("Low priority task %d started\n", i)
time.Sleep(500 * time.Millisecond)
fmt.Printf("Low priority task %d finished\n", i)
},
})
}
for i := 6; i <= 10; i++ {
wp.AddJob(Job{
ID: i,
Priority: HighPriority,
Task: func() {
fmt.Printf("High priority task %d started\n", i)
time.Sleep(500 * time.Millisecond)
fmt.Printf("High priority task %d finished\n", i)
},
})
}
// Даем время для обработки задач
time.Sleep(2 * time.Second)
// Останавливаем пул воркеров
wp.Stop()
}
То что он запускается - уже плюс. Важно конечно проверить корректность работы. А то что он отличается - это ведь вполне естественно. Модель не будет генерировать каждый раз один и тот же ответ на промпт. В моем случае - он ошибся в одном месте и не реализовал завершение только задач с высоким приоритетом, а ждал все горутины.
Думаю Реализация1 выдал ChatGPT, так как лучше и подробнее комментарии. Вообще заметил что ChatGPT любую мелочь "разъясняет" в коде
Сравнение кода от DeepSeek и ChatGPT по-гоферски