Если синхронизация базы данных должна быть реализована или хотя бы передана в двоичный файл, вы можете использовать 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()
}
Любое решение должно решить следующие общие проблемы:
- Просить всех работников прекратить работу.
- Обеспечение того, чтобы все работники успокоились до . Работа базы данных разрешена.
- Сигнализирует рабочим, что можно продолжать работу снова.
Альтернативные методы для этого включают в себя следующее, но, на мой взгляд, все нижеприведенное будет намного сложнее (и, следовательно, подвержено ошибкам), чем использование мьютекса:
Закрыть всех рабочих?
Если попросить работников прекратить работу до того, как работа с базой данных продолжится, это приведет к необходимому взаимному исключению. Вам нужен способ дать им сигнал прекратить и механизм, чтобы определить, когда это действительно завершилось.
В любом случае можно утверждать, что вам все равно это нужно, чтобы гарантировать правильное завершение работы при завершении программы. Однако завершение программы является фатальным, поэтому вам не нужно иметь возможность чистого запуска и остановки пула так же, как этого требует работа по синхронизации базы данных.
Использовать чан в работнике, чтобы не получить работу, если его приостановили?
Это было бы сложно реализовать, поскольку вам нужно было бы дать сигнал всем работникам прекратить работу и убедиться, что они действительно прекратили активно обрабатывать задания до начала работы. Требуется и обратное: сигнал для повторного запуска.
Самый простой инструмент для работы, который включает в себя наименьшее количество кода, - это мьютекс. Я рекомендую использовать это.