IPC вещательного стиля - PullRequest
       12

IPC вещательного стиля

2 голосов
/ 19 августа 2010

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

Я хочу, чтобы несколько процессов ожидали определенного события.То есть я хочу, чтобы они блокировались до тех пор, пока

  1. не достигнет определенного времени ожидания, или
  2. , если определенное событие инициируется другим процессом.

В любое время может быть произвольное количество таких процессов ожидания, и когда происходит событие пробуждения, все они должны проснуться, а не только один.

И одно ограничение, которое, вероятно, делает это намного сложнееЭто: Это должен быть PHP, и он также должен работать из mod_php, работающего в Apache.

1 Ответ

1 голос
/ 19 августа 2010

Ну, это немного "хакерски", но вы можете сделать это с помощью сокетов.Это действительно зависит от того, что вы пытаетесь сделать ... Мне действительно интересно, нужна ли вам такая система (а не пытаться упростить процессы там, где им вообще не нужен IPC) ...

Создайте демона "слушателя", который ничего не делает, только принимает соединения с сокетами и помещает их в очередь.Он будет запускать socket_select в ожидании либо нового соединения, либо данных, которые будут записаны в сокеты.Если данные были записаны, он записывает эти данные во все свои активные соединения, затем закрывает их и начинает заново.Если новое соединение получено, оно помещает его в очередь и затем возвращается к выбору ...

Итак, в вашем «потомке» все, что вам нужно сделать, это подключиться к мастеру, установить блокировку socket_set_block($sock), а затем установите время ожидания:

socket_set_option(
    $sock,
    SOL_SOCKET,  // socket level
    SO_SNDTIMEO, // timeout option
    array(
        "sec"=>10, // Timeout in seconds
        "usec"=>0  // I assume timeout in microseconds
    )
);

Затем просто прочитайте из сокета (socket_read($sock)).Он будет блокироваться до установленного вами тайм-аута или до тех пор, пока «мастер» не запишет обратно.После прохождения этого вызова, просто закройте сокет и продолжайте делать то, что вы хотите сделать ...

...