add Fiber (sackful coroutine) support
| From: | Haitao Lv | Date: | Thu, 31 Aug 2017 14:28:36 +0000 |
| Subject: | add Fiber (sackful coroutine) support | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-100335@lists.php.net to get a copy of this message | ||
Hi, All,
The generator has been introduced in PHP 5.5. And we can it pause a function execution.
With these feature, we can schedule multi io task in userland without blocking.
More details can be found at [Nikic].
And there is also some asynchronous frameworks like [AMP], which allow programer to
code like blocking, but run asynchronously.
However, like python's generator, lua's coroutine, javascript's async/await,
php's
generator also is a stackless coroutine implementation. We cannot pause a function call
in it's sub function call. This is the reason that frameworks like [AMP] has many wrapper,
is hard to understand, and almost impossible to be used to implement real but complex system.
So I propose to introduce the sackful coroutine, aka Fiber, support for PHP. And the possible
API like this,
> <?php
> function foo($a)
> {
> $b = await $a + 1;
> echo $b;
> }
>
> function bar()
> {
> foo();
> }
>
> $f = new Fiber(function($a) {
> bar($a);
> return 3;
> });
>
> $c = $f->resume(1);
> // 1 will be passed to lambda, then bar
> // bar call foo, and the **await** in foo paused this execution
> // and make the return value of resume as $a + 1
> // so $c is 2
>
> $c = $f->resume(3);
> // resume the execution by previous await, and the $b in foo
> // will be assigned a value of 3
> // so foo echo 3 and return and then the lambda return
> // and the resume got a return value of 3. so $c is 3.
So the Fiber API is a little like the Generator API, but is more simple yet powerful. So there
is no need to distinct $generator->current(), $generator->send(), and
$generator->getReturn().
I made a more complex example at [FIREPHP].And I also make a [PR] for comment.
All comment are welcome. Thanks.
[Nikic] https://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html
[AMP] http://amphp.org/
[FIREPHP] https://github.com/fiberphp/fiber-core/blob/master/app.php
[PR] https://github.com/php/php-src/pull/2723