ipc — процесс блокировки PHP до пробуждения или истечения времени ожидания

Я хочу, чтобы 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 можно было бы предположить.

0

Решение

Я думаю (единственный?) Способ, которым вы можете обойтись без этого, если вы хотите, чтобы другой процесс, а не тот, который получает блокировку, был тем, который снимет блокировку, — это сохранить блокировку в разделяемой памяти.

Например, создайте класс, который действует как блокировка, используя файл блокировки или что-то подобное, сохраните объект блокировки в разделяемой памяти, получите доступ к нему во вторичном процессе и освободите его.

Я обычно использую файлы блокировки и т. Д., Чтобы убедиться, что вторичный процесс НЕ запускает определенный фрагмент кода, пока какой-то другой процесс его выполняет. Таким образом, только процесс, который создал блокировку, может снять ее. То, как вы хотите отслеживать, каким процессам Parallell разрешено снимать блокировку, — это то, что вам нужно выяснить.

Совместно используемая память PHP

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]