Pull to refresh

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 любую мелочь "разъясняет" в коде

Да, все верно. Напишите мне в хабрасообщения данные, куда отправить книжку

Sign up to leave a comment.

Articles