我希望一个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 主机。
我认为(唯一?)如果您想要另一个进程而不是获取锁的进程来释放它,则可以逃脱这种情况,方法是将锁存储在共享内存中。
例如,创建一个使用锁定文件或类似的东西充当锁的类,将锁对象存储在共享内存中,在辅助进程中访问它并释放它。
我通常使用lockfiles等来确保辅助进程不会运行某段代码,而其他进程正在运行它。因此,只有创建锁的进程才能释放它。因此,您希望如何跟踪允许哪些并行进程释放锁是您需要弄清楚的事情。
PHP 共享内存