为了账号安全,请及时绑定邮箱和手机立即绑定

暂停工作人员池

暂停工作人员池

Go
慕码人2483693 2023-03-29 17:10:02
使用看起来比这更接近的工作池的 golang 实现我想暂停我的工作人员几秒钟,同时像交易过程一样进行数据库同步。我不希望我的同步数据被另一个潜在的不受控制的工作人员更新。暂停工作的最佳方式是什么?关闭所有工人?在工人中使用 chan 以防止在暂停时找到工作?在处理工作之前使用全局标志在每个工人中设置一个锁?谢谢
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

如果要实现数据库同步或至少向二进制文件发出信号,您可能会RWMutex为此目的滥用 。


Read在 worker 进行普通工作时 使用互斥锁的一侧,并要求Write在执行数据库同步操作时保持该侧。


至关重要的是,您必须确保Read仅在工作实际进行时举行。如果 worker 因等待更多工作而被阻塞,则不得持有读锁,因为这会使挂起的 writer 饿死。


如果您使用它,我强烈建议您在代码中添加有关互斥体预期行为的文档,因为这在读写操作方面有些不标准。


如果您想要一个更通用的解决方案,您还可以包装它并从派生接口导出不同的方法,并使用更好的名称,如示例所示:


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()

}

任何解决方案都必须解决这些一般问题:

  • 要求所有工人停止工作。

  • 确保在允许数据库工作开始之前所有工作人员都已停止。

  • 向工人发出可以安全继续工作的信号。

这样做的替代方法包括以下方法,但在我看来,以下所有方法都比使用互斥锁复杂得多(因此容易出现错误):

  • 关闭所有工人?

    要求工作人员在数据库工作继续进行之前停止工作将实现所需的互斥。您需要一种向它们发出停止信号的方法,以及一种检测何时真正完成的机制。

    在任何情况下都可能会争辩说您无论如何都需要它来确保您在程序终止时干净地关闭。但是,程序终止是致命的,因此您不需要能够按照此数据库同步工作所需的方式干净地启动和停止池。

  • 在工人中使用 chan 以防止在暂停时找到工作?

    这实施起来会很复杂,因为您需要向所有工人发出停止工作的信号,并确保他们在开始工作之前确实已经停止主动处理工作。还需要反向:重新开始的信号。

涉及最少代码的工作的最简单工具是互斥锁。我建议使用那个。


查看完整回答
反对 回复 2023-03-29
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信