我有一个每晚需要运行的进程 - 每晚运行一次。它是一个后台服务,作为我的 Blazor 应用程序的一部分运行。我可以运行应用程序的多个实例(横向扩展)。
基本上我需要一个信号量,其中一个后台服务获取它并进行夜间处理。其余的则不然。我还需要它,如果抓住它的那个然后中途崩溃,另一个将抓住它并完成(他们所做的工作是在击中数据库的事务中,所以如果一个死了,另一个可以接手工作)。
所以我认为我需要一个返回以下之一的信号量:
有办法做到这一点吗?如果是这样,怎么办?我真正遇到的困难是处理崩溃后启动的服务器。
当您谈论信号量时,我假设您在单个系统上运行单独的进程。
根据这个假设,我的猜测是您需要使用命名的互斥体而不是信号量。
您希望第一个线程获取互斥锁,而其他线程则等待。如果执行线程完成,它可以设置互斥锁保护的数据状态以完成。一旦它释放互斥锁,下一个线程就会抓住它检查状态然后退出......
如果线程崩溃,互斥锁将被视为废弃而释放,下一个获取者需要收拾残局。