Выполняйте задания одновременно в последовательном порядке - PullRequest
1 голос
/ 17 апреля 2019

"Что?" Вы спрашиваете: «Этот заголовок не имеет никакого смысла».

Учтите следующее: enter image description here Задания с разными идентификаторами могут обрабатываться асинхронно, но задания с одинаковым идентификатором должны обрабатываться синхронно и в порядке очереди.

Моя текущая реализация создает подпрограмму go для обработки заданий для каждого конкретного идентификатора и выглядит примерно так:

func FanOut() chan<- *Job {
    channel := make(chan *Job)
    routines = make(map[string]chan<- *Job)
    go func() {
        for j := range channel {
            r, found := routines[j.id]
            if !found {
                r = Routine()
                routines[j.id] = r
            }
            r <- j
        }
    }()
    return channel
}

Кажется, это работает хорошо (в текущем тестировании), но создание тысяч подпрограмм го может быть не лучшим подходом? Кроме того, блоки кода разветвления, если не используется буферный канал.

Вместо набора процедур go (выше) я рассматриваю возможность использования коллекции sync.Mutex. Идея состоит в том, чтобы иметь пул подпрограмм go, которые сначала должны установить блокировку мьютекса, соответствующую идентификатору задания.

Существуют ли какие-либо шаблоны Go, подходящие для удовлетворения этих требований?

Есть ли лучший подход?

1 Ответ

1 голос
/ 18 апреля 2019

Создать канал для каждого идентификатора - возможно, часть каналов или карту (индексируется по идентификатору). Каждый канал будет иметь подпрограмму, которая обрабатывает задания для этого идентификатора по порядку. Простой.

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

Кстати, я добавил это только как ответ, так как мне не разрешено добавлять комментарии (пока?).

...