Одноврéменно || Одновремéнно

Автор оригинала: Zend Technologies Ltd
  • Перевод
image

Введение


ZendX_Console_Process_Unix позволяет разработчикам создавать объекты под видом процессов, и таким образом параллельно выполнять несколько задач. Из-за особенностей реализации на текущий момент эта возможность доступна только на *nix системах, таких как Linux, Solaris, Mac / OSX и другие в CLI или CGI режиме. Кроме того для работы этого компонента необходимы следующие модули: Shared Memory, Process Control и POSIX. Если одно из требований не выполняется, то будет брошено исключение.

Основы использования ZendX_Console_Process_Unix


ZendX_Console_Process_Unix это абстрактный класс, который должен быть расширен пользователем. В нем находится единственный абстрактный метод _run(), который должен описывать реализуемый алгоритм обработки тех или иных данных. Так же в классе определенны методы для проверки состояния процесса и обмена переменными между основным и дочерними процессами.

Метод _run(), а так же каждый метод вызванный внутри него будет выполняться в отдельном процессе. Любой другой метод, вызванный в вашем приложении будет выполняться в родительском процессе.

Методы setVariable () и getVariable () могут быть использованы для передачи переменных между родительским и дочерними процессами. Для наблюдения за статусом дочернего процесса следует вызывать внутри него метод _setAlive () через короткие промежутки времени, таким образом родительский процесс сможет получить информацию о состоянии дочернего процесса посредством вызова метода getLastAlive (). Чтобы получить PID дочернего процесса, родитель может вызвать getPid().

  1. class MyProcess extends ZendX_Console_Process_Unix
  2. {
  3.   protected function _run()
  4.   {
  5.     for ($i = 0; $i < 10; $i++) {
  6.       // Doing something really important which can't wait: sleeping
  7.       sleep(1);
  8.     }
  9.   }
  10. }
  11. // This part should last about 10 seconds, not 20.
  12. $process1 = new MyProcess();
  13. $process1->start();
  14. $process2 = new MyProcess();
  15. $process2->start();
  16. while ($process1->isRunning() && $process2->isRunning()) {
  17.   sleep(1);
  18. }
  19. echo 'All processes completed';
* This source code was highlighted with Source Code Highlighter.

В этом примере процесс распараллелен на два и запущен. Каждый дочерний процесс выполняется по 10 секунд, следовательно родительский процесс будет завершен в течение 10 секунд (а не 20).

P. S.
Не смотря на то что я достаточно активно использую Zend Framework и то что это компонент доступен уже более 16 месяцев (с 31 октября 2008), о его существовании я узнал только сейчас, возможно теперь curl боты станут еще злее.

Похожие публикации

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 34

    +3
    Мицгол вас… Не ОдноврЕменно и не ОдновремЕнно. Мы же в utf-8: одноврéменно! Ну или одновремéнно :)
      0
      О, а просветите молодого-неопытного: как ударения вставлять? Во всяких «таблицах символов» их, есесна, нет, а с клавиатуры как брать аккорд — не знаю.
        0
        Left Alt + Четыре_Цифры_С_Числового_Блока (numpad который).
          0
          Спасибо. Несмотря на то, что я и так знал, что можно делать альтом с цифрами, я решил перепроверить свой более ранний комментарий и, забурившись в таблицу символов, таки нашел там «комбинирующиеся» символы-модификаторы. А также и уже скомбинированные символы вроде &eacute;.
        +1
        Кто в utf-8, а кто и нет. Гришковец, например, нет, у него оно выглядит как «ОдноврЕмЕнно».
        +3
        А при чем тут curl-боты? На сколько я помню, curl и так поддерживает параллельную обработку потоков. Под win-системы бы такое… А то exec() как-то не греет, с созданием еще одного процесса интерпретатора. Брр.
          +1
          Поддерживает поддерживает, это так… к слову пришлось.
            –1
            win-системы? Брр.
              +1
              Понт защитан.
            0
            А чем оно хуже/лучше PCNTL?
              +5
              Оно и есть PCNTL, во всяком случае враппер к нему.
                0
                Т.е. в собранном php должен быть PCNTL?
                  0
                  упс, плохо читал комментарии ниже.
              +3
              Что за Физика Лобачевского? Он же в основном геометрией занимался…
                0
                У меня бросает exception 'ZendX_Console_Process_Exception' with message 'Can only run on CLI or CGI enviroment' :(

                Придётся и дальше по старинке делать exec() для фоновых задач типа генерации pdf.
                  0
                  А вы как запускаете? Надо чтобы из командной строки или как CGI/FCGI приложение.
                    0
                    Да, это я как-то не подумавши.
                    В командной строке всё верно, пишет: 'pcntl_* functions are required' — требует Process Control.
                    0
                    php собрать надо с --enable-pcntl.
                  • НЛО прилетело и опубликовало эту надпись здесь
                      0
                      А как же Windows? :'-\
                        0
                        Под виндовсом создание процесса небось займет больше времени, чем выполнение. Во всяком случае, при частом запуске. А при нечастом так можно и без враппера свой собственный запуск другого скрипта соорудить.
                        +1
                        crul бот запускается так в несколько процессов:
                        >php bot.php
                        >php bot.php
                        >php bot.php
                        >php bot.php
                          0
                          интересно опечатался, погуглил, он мне предложил «Возможно, вы имели в виду: сруль»
                            +1
                            А я, дурак, думал что так.
                              –2
                              не важно, мысль о том, что фраза про curl ботов не совсем верна
                                +1
                                «А я так вижу» ©
                            0
                            Наглядный пример того, как к языку, который изначально задумывался для другого, да и вся канва его развития, как ни крути, все же солидарна с его первоначальным применением, прикручивают всяческие рюшечки, которые хоть ты тресни не более чем рюшечками и останутся.
                              +2
                              Когда я вижу человека пишущего на PHP в его первозданном стиле, непременно хочется отыскать этого человека и обстоятельно разъяснить ему свою точку зрения на это.
                                0
                                Я не говорил о том, что нужно писать на PHP в его первозданном состоянии.
                                А лишь хотел сказать, что для любой задачи всегда найдется инструмент, с помощью которого задача решается проще, менее ресурсоемко и элегантнее, чем с помощью того инструмента, которым человек привык пользоваться. Стоит просто внимательнее осмотреться.
                              –2
                              что за тэг!? причем тут лобачевский и физика?? ) лобачевского — геометрия! там сумма углов равностороннего треугольника меньше 180 градусов и прямых параллельных данной через точку не лежащую на данной прямой может быть проведено бесконечное множество, а не одна единственная, как у нас в евклидовом.

                              но, вобщем, я понимаю к чему вы) как сказал Бродский «ощущенье будто вычтен Лобачевский из пространства» )
                                0
                                Было скучно, но зато как замечательно по этому тегу теперь будут находится мои статьи и проза.
                                +3
                                один хрен, стадо движется со скоростью самой медленной овцы. Т.е если второй процесс занимает много времени, второй его будет ждать. Старый добрый exec() пока спасает :)
                                  0
                                  Согласен. Некогда сталкивался с задачей рапраллеливания процессов. в pcntl есть проблема в том, что он под модулем апача не работает, только cli или cgi.
                                  Поэтому сейчас параллельные процессы делаю с помощью exec('cmd > /dev/null &'),
                                  а обмениваются данными они через очередь сообщений unix. Под виндой разумеется это не работает.
                                  Кстати подобное распралеливание отлично оптимизирует циклы. Если вместо итераций сделать параллельные процессы, то суммарное время выполнения равно времени выполнения самой долгой итерации, а по старинке (цикл из последовательно выполняющихся итераций) равен сумме времени от каждой итерации. Только при таком размножении стоит быть аккуратным, если в итераций много и все они одновременно попытаются использовать какой-то ресурс, не обладающий достаточной пропускной способностью…
                                  +1
                                  в избранное, попробовать как руки дойдут

                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                  Самое читаемое