> On Dec 17, 2020, at 4:11 PM, Saif Eddin Gmati <azj...@protonmail.com> wrote:
> 
> Hello Aaron,
> 
> First, I want to say that I love this proposal and would love to see it land 
> in the next PHP release, but I have one question regarding this:
> 
> 
>> Promises result in the “What color is your function” problem as described in 
>> the introduction of the RFC. Returning promises from functions means that 
>> functions calling those functions must also return promises, resulting in 
>> the entire call stack needing to return promises.
> 
> Hack-Lang provides `HH\Asio\join` function which allows awaiting Awaitables 
> in sync code, so you are capable of running multiple async tasks concurrently 
> without having to declare the entire call stack as "async" or with an 
> "Awaitable" return type, isn't this possible?
> 
> ```
> use namespace HH\Asio;
> 
> async function async_task(): Awaitable<void> {
>  await Asio\usleep(1000000);
> }
> 
> <<__EntryPoint>>
> function main(): void {
>  $start = microtime(true);
> 
>  $async = async {
>    concurrent {
>      await async_task();
>      await async_task();
>    };
> 
>    return 'hello';
>  };
> 
>  $result = Asio\join($async);
> 
>  printf('Result: %s ( %f )', $result, microtime(true) - $start); // output 
> "Result: hello ( 1.010382 )"
> }
> 
> ```
> 
> Regards,
> 
> Saif.
> 


Hi Saif,

`HH\Asio\join()` implements a synchronous await (I don't know the details of 
how its implemented, possibly involving entering and exiting the built-in event 
loop), but it does not solve the problem that functions using `await` need to 
be declared using `async` and return an Awaitable. Your example declares 
`async_task()` as async, while a similar function using the proposed fiber API 
would not need to change the function declaration to use `Fiber::suspend()`. 
There's an example in the RFC using `Amp\delay()` that is very similar to your 
code sample.

Fibers allow existing interfaces to be implemented using either sync or async 
I/O because the interface does not need to change to return promises/awaitables.

Cheers,
Aaron Piotrowski

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to