Приостановить рабочий пул - PullRequest
       17

Приостановить рабочий пул

0 голосов
/ 06 сентября 2018

С реализацией рабочего пула golang, которая выглядит ближе, чем this

Я хочу приостановить работу своих работников на несколько секунд, одновременно синхронизируя базу данных, как процесс транзакции. Я не хочу, чтобы мои данные синхронизации обновлялись другим потенциальным неконтролируемым работником.

Каков наилучший способ приостановить работу?

  • Закрыть всех рабочих?
  • Использовать чан в работнике, чтобы не получить работу, если его приостановили?
  • Использовать глобальный флаг для настройки блокировки каждого рабочего перед обработкой задания?

Спасибо

1 Ответ

0 голосов
/ 06 сентября 2018

Если синхронизация базы данных должна быть реализована или хотя бы передана в двоичный файл, вы можете использовать RWMutex для этой цели.

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

Важно, чтобы Read было только , когда оно действительно выполняется. Если работник заблокирован в ожидании дополнительной работы, блокировка чтения должна не удерживаться, поскольку это приведет к истощению ожидающих писателей.


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

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

type WorkerGroupLocker struct {
    sync.RWMutex
}

func (lock *WorkerGroupLocker) LockWorker() {
    lock.RLock()
}

func (lock *WorkerGroupLocker) UnlockWorker() {
    lock.RUnlock()
}

func (lock *WorkerGroupLocker) LockBackgroundSync() {
    lock.Lock()
}

func (lock *WorkerGroupLocker) UnlockBackgroundSync() {
    lock.Unlock()
}

Любое решение должно решить следующие общие проблемы:

  • Просить всех работников прекратить работу.
  • Обеспечение того, чтобы все работники успокоились до . Работа базы данных разрешена.
  • Сигнализирует рабочим, что можно продолжать работу снова.

Альтернативные методы для этого включают в себя следующее, но, на мой взгляд, все нижеприведенное будет намного сложнее (и, следовательно, подвержено ошибкам), чем использование мьютекса:

  • Закрыть всех рабочих?

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

    В любом случае можно утверждать, что вам все равно это нужно, чтобы гарантировать правильное завершение работы при завершении программы. Однако завершение программы является фатальным, поэтому вам не нужно иметь возможность чистого запуска и остановки пула так же, как этого требует работа по синхронизации базы данных.

  • Использовать чан в работнике, чтобы не получить работу, если его приостановили?

    Это было бы сложно реализовать, поскольку вам нужно было бы дать сигнал всем работникам прекратить работу и убедиться, что они действительно прекратили активно обрабатывать задания до начала работы. Требуется и обратное: сигнал для повторного запуска.

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

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