Как React PHP обрабатывает асинхронный неблокирующий ввод-вывод?

Как React PHP обрабатывает асинхронный неблокирующий ввод-вывод?

Nodejs использует свою очередь событий, которая обрабатывает ввод-вывод в разных потоках. Для этого используется libuv. Поскольку в PHP нет ничего подобного, как React обрабатывает неблокирующий процесс ввода-вывода в одном потоке?


person Reza Shadman    schedule 16.06.2015    source источник
comment
возможный дубликат ReactPHP действительно асинхронен?   -  person Blizz    schedule 16.06.2015


Ответы (1)


React PHP обеспечивает основной цикл событий приложения; вам по-прежнему необходимо писать свой код неблокирующим образом, поскольку все это находится в одном потоке. Все возможные решения для этого вращаются вокруг использования php не так, как, я уверен, привыкло большинство разработчиков php... Хотя React PHP обеспечивает основной цикл; основная часть библиотек React PHP — это реализации для сокетов/потоков/обещаний/и т. д. Все они использовали методы для обеспечения неблокирующего доступа к вводу-выводу; обычно с помощью stream_set_blocking (http://php.net/manual/en/function.stream-set-blocking.php)

Другие варианты включают программирование чего-то похожего на FSM (https://en.wikipedia.org/wiki/Finite-state_machine); что позволяет ему постоянно обновлять свое текущее состояние по мере его продвижения; каждый раз позволяя запускать определенные фрагменты кода, а затем отказываясь от потока для чего-либо еще в цикле. По сути, реализация собственного разделения времени (https://en.wikipedia.org/wiki/Preemption_(computing)#Time_slice)

Другой вариант — реализовать потоки (http://php.net/manual/en/book.pthreads.php), который обычно не включен по умолчанию; И последний вариант, который я могу придумать, это использование управления процессами для разветвления/запуска/управления другими процессами (http://php.net/manual/en/intro.pcntl.php), который доступен только в системах *nix; который позволяет вашему центральному процессору управлять разделением времени; вам просто потребуется спроектировать ваше приложение, чтобы оно было потокобезопасным, взаимодействовало с очередями сообщений или каким-либо другим механизмом.

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

person Method    schedule 16.06.2015