我想要一个PHP脚本来锁定自己(即等待没有CPU使用,没有轮询),直到被其他PHP脚本唤醒或达到X秒的特定超时。
此外,我希望IPC以二进制信号量方式工作,除了释放信号量的过程不是获取信号量的过程。显然这对sem_release()来说是不可能的:
sem_release()
释放信号量(如果当前获取信号量) 调用过程,否则会生成警告。
获取锁定的过程负责处理大量数据,即释放信号量的人表明它已准备好进行处理。让我们将P1命名为处理数据的过程,P2命名生成数据的过程,从而指示P1新数据可用于处理。当P1正在处理其他数据时,P2可以多次向P1提供新数据,但是当P1决定处理新数据时,处理所有数据,这意味着每次P2发出信号时都不应该获取P1。新数据。如果两者之间没有数据可用,则应连续两次运行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主机。
答案 0 :(得分:0)
我认为,如果您希望将获取锁的进程作为释放该锁的进程以外的其他进程,那么可以避免的(唯一方法)是将锁存储在共享内存中。
例如,使用一个锁文件或类似的东西,使一个充当锁的类,将锁对象存储在共享内存中,在辅助进程中对其进行访问并释放它。
我通常使用锁文件等来确保辅助进程在其他进程正在运行时不会运行某些代码。因此,只有创建锁的进程才能释放它。因此,如何确定允许哪个并行进程释放锁定的方法将为您解决。