如何通过数据库实现信号量?

问题描述 投票:0回答:1

我有一个每晚需要运行的进程 - 每晚运行一次。它是一个后台服务,作为我的 Blazor 应用程序的一部分运行。我可以运行应用程序的多个实例(横向扩展)。

基本上我需要一个信号量,其中一个后台服务获取它并进行夜间处理。其余的则不然。我还需要它,如果抓住它的那个然后中途崩溃,另一个将抓住它并完成(他们所做的工作是在击中数据库的事务中,所以如果一个死了,另一个可以接手工作)。

所以我认为我需要一个返回以下之一的信号量:

  1. 可用 - 呼叫者现在拥有它。
  2. 处理中 - 稍微回来检查一下工作人员是否超时。
  3. 工作已完成 - 明天晚上回来查看。

有办法做到这一点吗?如果是这样,怎么办?我真正遇到的困难是处理崩溃后启动的服务器。

sql azure-sql-database blazor-server-side semaphore
1个回答
0
投票

当您谈论信号量时,我假设您在单个系统上运行单独的进程。

根据这个假设,我的猜测是您需要使用命名的互斥体而不是信号量。

您希望第一个线程获取互斥锁,而其他线程则等待。如果执行线程完成,它可以设置互斥锁保护的数据状态以完成。一旦它释放互斥锁,下一个线程就会抓住它检查状态然后退出......

如果线程崩溃,互斥锁将被视为废弃而释放,下一个获取者需要收拾残局。

© www.soinside.com 2019 - 2024. All rights reserved.