Процесс блокировки 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 можно было бы предположить.

1 ответ

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

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

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

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

Другие вопросы по тегам