使用golang实现的工作池看起来比this更接近
我想暂停我的工作几秒钟,同时像事务处理一样进行数据库同步。我不希望我的同步数据被另一个潜在的不受控制的工作人员更新。
暂停工作的最佳方法是什么?
谢谢
如果要实现数据库同步或至少向二进制文件发出信号,则可能为此目的滥用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()
}
任何解决方案必须解决这些一般问题
这样做的替代方法包括以下内容,但在我看来,下面的所有内容都比使用互斥锁要复杂得多(因此容易出错):
涉及代码最少的工作的最简单工具是互斥锁。我推荐使用它。