Re: async/await - is future reserved words in PHP 7.x?
| From: | Aaron Piotrowski | Date: | Tue, 29 Sep 2015 16:16:24 +0000 |
| Subject: | Re: async/await - is future reserved words in PHP 7.x? | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-88559@lists.php.net to get a copy of this message | ||
Hi Thomas,
> On Sep 29, 2015, at 10:22 AM, Thomas Hruska <thruska@cubiclesoft.com> wrote:
>
> On 9/29/2015 6:52 AM, Joe Watkins wrote:
>> We shouldn't reserve words on a whim ...
>>
>> async/await doesn't solve any problems for multithreaded programming, at
>> all ... it solves problems for asynchronous programming, a different
>> concept ... let's not confuse the two ...
>
> Actually, it does. Asynchronous and multithreaded programming are attempts at solving the
> exact same problem: Simultaneously handling multiple data streams in whatever form that takes
> whether that be network, hard drive, random device XYZ, RAM, or even CPU. The former says,
> "Let's wait until we can read or write and continue when we have data." The latter
> says, "Let's read and write but let the OS handle context switching to give the appearance
> of simultaneously handling multiple data streams."
>
> Async/await is both the best of and THE solution to both worlds. It allows, on a single
> thread, multiple functions to be executed simultaneously, resuming each function exactly where it
> left off when the async call "returns" to the await. This feature results in *elegant
> userland code* that never unexpectedly blocks, transparently fires up threads wherever necessary,
> maintains mapped pools of handles behind the scenes, and resumes functions where they left off on
> the original thread. There is no other equivalent model today that doesn't involve tons of
> error-prone plumbing. Also, with today's error-prone models, portions of async/await actually
> can't be implemented without resorting to questionable assembler hacks (hello 1980's!).
> As I said earlier, async/await is the single greatest solution to multithreading (because very
> little code actually needs multiple threads in an async/await world) but it also dramatically
> simplifies asynchronous programming. Async/await also can't be implemented in libraries - it
> has to be implemented in the core of the language itself and therein lies both the genius for
> userland code (thank you Microsoft!) as well as the horribleness for language designers (thank you
> Microsoft?). Everyone who writes "userland code" in any given language wants this, but no
> one ever wants to be responsible for correctly implementing this feature because there is much evil
> hackery required to pull it off.
>
> For the most part, PHP follows a single-threaded, synchronous/sometimes asynchronous model,
> which works well for web, and therefore means users can somewhat fake async/await with
> promises/futures and no one there will really notice because no one there will really use either
> feature. However, the single-threaded model doesn't necessarily apply to CLI where some of the
> real power of PHP can be leveraged - with long-running processes, unlimited CPU, and fewer RAM
> limitations, a lot of possibilities open up.
>
> So the underlying question really is: Is PHP, particularly CLI, ever going to leave its
> single-threaded model? If not, then this discussion dies here. But if so, then async/await is the
> most desirable solution, albeit being extremely evil and difficult to implement.
>
> https://channel9.msdn.com/Events/Build/2012/3-011
>
> --
> Thomas Hruska
> CubicleSoft President
>
> I've got great, time saving software that you will find useful.
>
> http://cubiclesoft.com/
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
Asynchronous programs do not solve the same problem as multithreading. Asynchronous programs cannot
execute code in parallel like a multithreaded program. Asynchronous code relies on non-blocking I/O
to continuously execute available tasks in a single thread of execution, but only one function is
ever being executed at a time within that thread. Often separate threads are used to implement
non-blocking I/O or other tasks. Asynchronous coding is a complement to multithreading, not a
replacement.
Implementing elegant, readable, and stable asynchronous code in userland PHP code is very possible.
In fact, I’ve done exactly this with Icicle (https://github.com/icicleio/icicle). Icicle uses
generators and promises to implement coroutines. When a coroutine yields a promise, the coroutine is
interrupted until the promise resolves, sending or throwing the resolution value into the generator.
While a coroutine is interrupted, other code in the program is given the chance to be executed. This
behavior is similar to async/await, instead using a generator as the async function and yield as
await. There are several packages available for Icicle that implement non-blocking I/O and
concurrency (multithreading). There are no extensions required for Icicle and no black magic –
just making good use of the tools already available.
Regards,
Aaron Piotrowski