【问题标题】:How React PHP handles async non-blocking I/O?React PHP 如何处理异步非阻塞 I/O?
【发布时间】:2015-09-01 00:58:14
【问题描述】:

React PHP 如何处理异步非阻塞 I/O?

Nodejs 使用它的事件队列来处理不同线程上的 I/O。它为此使用 libuv。在 PHP 中没有这样的东西,React 如何在单个线程上处理非阻塞 I/O 进程?

【问题讨论】:

标签: php asynchronous concurrent-programming reactphp


【解决方案1】:

React PHP 提供应用程序的主要事件循环;您仍然需要以非阻塞方式编写代码,因为它都在一个线程上。可能的解决方案都围绕着使用 php 与我确信大多数 php 开发人员习惯的不同......虽然 React PHP 提供了主循环;大部分 React PHP 库是 sockets/streams/promise/etc 的实现。这些都采用了方法来实现对 I/O 的非阻塞访问;通常通过使用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 系统上启用;这让您的主机 CPU 控制时间片;您只需将应用程序架构为线程安全、与消息队列通信或其他一些机制。

tldr;使用您的应用程序架构不会导致 php 阻塞,将流设置为不阻塞,或使用线程/进程控制来管理您自己的多线程。

【讨论】:

    猜你喜欢
    • 2018-04-06
    • 2011-09-16
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2020-05-24
    • 2018-10-14
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多