Реализация потоков в PHP (fork/форк)

Ноябрь 17, 2007

Сложилось так, что разработчики от порождения к последней версии PHP обходят стороной многопоточность... А ведь довольно часто приходится выполнять задачи в многопоточном режиме. Первое, что приходит на ум (самое здравое, кстати) — использовать форк — подход порождения процессов. Вот что говорит нам Википедия:

В Unix-системах, fork () — системный вызов, создающий новый (дочерний) процесс, идентичный выполняющему этот вызов. После вызова fork () алгоритм обычно разветвляется (родительский процесс получает от fork () PID дочернего, а дочерний получает нуль).


Технически это реализуется следующим образом: строится т.н. дерево:

  • Обработчик процессов
  • Индикатор процессов
  • Сам процесс

Начнем по-порядку.

Обработчик процессов

Запустившись, он смотрит на следующие параметры: количество допустимых потоков, количество исполняемых потоков, сигнал запуска (true/false). На основе этих данных он принимает решение — запускать или нет еще один процесс.

Индикатор процессов

Каждый процесс, после запуска, оставляет о себе метку: мол, взял кусок данных — это моё, запускать на 1 процесс меньше, чем получил. Отработав — говорит «я отработал. данные записал. метку оставил».

Ну и сам процесс

Выполняет то, что должен, включая код индикатора...

Реализуется это довольно просто. Будет время — выложу «многопоточный» парсер чего-нибудь =)

Удачного коденга ;-)

2 комментариев на “Реализация потоков в PHP (fork/форк)”

  1. nick1 высказал:

    Выложи плз, хотя бы элементарный пример, что бы механику просмотреть

  2. MiXeR высказал:

    Fork вряд ли на виртуальных хостингах доступен... Это же сильно нагружает сервер — каждый вызов создаёт новый процесс интерпритатора php, вроде около 15 метров памяти. Имхо, curl с поддержкой мультипоточности или fsockopen лучше (вижу что пост давний, просто интересно твоё мнение на данный момент услышать про это, так как сам сейчас столкнулся с похожей задачей)