Перейти рабочий шаблон для теплых работников - PullRequest
1 голос
/ 26 октября 2019

Я работаю над проблемой, когда у меня есть набор «теплых работников». Это означает, что они сохраняются в памяти, поддерживают свой собственный контекст и могут вызываться. Я смотрел на различные реализации рабочих Go, но все они зависят от замыканий или простых функций вычисления, которые возвращают результаты.

Я нашел пример работника, который позволяет мне раскручивать мои контексты и распределять задачи по ним на основемаксимальная очередь и максимальный предел процедуры: https://github.com/cahitbeyaz/job-worker/blob/master/main.go#L131

Однако этот шаблон не позволяет мне возвращать результат из контекста и возвращать его обратно. Я также использую веб-сервер, и поэтому веб-обработчик должен получать результат и отвечать соответствующим образом.

Есть ли определенный / лучший шаблон, которому я должен / мог бы следовать, или способ, которым я мог бы адаптировать работникапример?

PS. Сначала я подумал, что смогу создать ResultQueue, где результаты возвращаются и используются веб-обработчиком. Я не думаю, что на порядок очереди можно рассчитывать.

1 Ответ

1 голос
/ 26 октября 2019

Решение невероятно простое (я определенно слишком усложнял его). Не уверен, насколько эффективно это на самом деле, но сомневаюсь, что это не слишком страшно. Предложения по улучшению шаблона все еще приветствуются:

В определении задания объявите канал для обратной связи с результатом:

type Job struct {
    Request string
    Params  []string
    Result chan Result
}

Внутри вашего работника, а не просто выход с возвратом, передайтеСтруктура результата по каналу:

job.Result <- Result{
    Response: result.String(),
    Headers:  []string{},
}

Теперь внутри веб-обработчика просто подождите на канале:

disatcher.jobQueue <- job
result := <- job.Result

Глупый меня. Не знаю, почему это заняло 2 часа усилий. :-p урок усвоен: идти параллелизм МОЩНО. Только не думай об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...