我想要一个 PHP 脚本来锁定自己(即等待没有 CPU 使用,没有轮询),直到被其他 PHP 脚本唤醒或达到 X 秒的特定超时。
此外,我希望 IPC 以二进制信号量方式工作,但释放信号量的进程不会是获取它的进程。显然这对于 sem_release() 是不可能的:
sem_release()
如果当前被调用进程获取,则释放信号量,否则生成警告。
获取锁的过程负责处理大量数据,无论谁释放信号量都表明它已准备好进行处理。让我们将 P1 命名为处理数据的进程,将 P2 命名为生成数据的进程,从而指示 P1 新数据可用于处理。当 P1 正在处理其他数据时,P2 可能会多次向 P1 提供新数据,但是当 P1 决定处理新数据时,所有数据都会被处理,这意味着 P1 不应在每次 P2 发出有新数据的信号时获取。如果在两者之间没有可用的数据,则 P1 的两次连续运行应该阻塞。
这就是我试图实现的原因:
Time Event Semaphore Status
0 P1 attempts acquire Unavailable / Process waiting
1 P2 releases Available / Process waiting
P1 acquires Unavailable / Process running
2 P2 releases Available / Process running
3 P2 releases Available / Process running
4 P1 acquires Unavailable / Process running
5 P1 attempts acquire Unavailable / Process waiting
------- after X seconds
10 TimeOut, P1 goes on Unavailable / Process running
11 P2 releases Available / Process running
12 P1 acquires Unavailable / Process running
...
我担心使用消息队列等其他方法可能会导致丢失某些事件(即循环直到队列为空以清除它)所以我想保持简单。
我只想使用 PHP,但可以假设是 Linux 主机。