Я хочу, чтобы PHP-скрипт сам блокировался (т. Е. Ожидал без использования процессора, без опроса), пока не будет пробужден другим 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 можно было бы предположить.
Я думаю (единственный?) Способ, которым вы можете обойтись без этого, если вы хотите, чтобы другой процесс, а не тот, который получает блокировку, был тем, который снимет блокировку, — это сохранить блокировку в разделяемой памяти.
Например, создайте класс, который действует как блокировка, используя файл блокировки или что-то подобное, сохраните объект блокировки в разделяемой памяти, получите доступ к нему во вторичном процессе и освободите его.
Я обычно использую файлы блокировки и т. Д., Чтобы убедиться, что вторичный процесс НЕ запускает определенный фрагмент кода, пока какой-то другой процесс его выполняет. Таким образом, только процесс, который создал блокировку, может снять ее. То, как вы хотите отслеживать, каким процессам Parallell разрешено снимать блокировку, — это то, что вам нужно выяснить.
Других решений пока нет …