About whether D / rust / golang can be popular.
Jacob Carlborg
doob at me.com
Thu Nov 26 14:18:55 UTC 2020
On Thursday, 26 November 2020 at 09:49:51 UTC, Ola Fosheim
Grostad wrote:
> Isnt await just syntactic sugar for a promise/future?
No, not really, but it's used together with promises or they're
used under the hood.
> If you can provide an example of what await should expand into
> then I might be able to add it to my experimental D compiler
> and you could then write a DIP.
Async/await is basically a coroutine. It allows a function to be
suspended and resumed. Here's an example of how the code could
look like in D:
async int foo()
{
await sleep(1.seconds); // simulate work that takes long time
writeln("foo");
return 1;
}
async int bar()
{
writeln("bar");
return 2;
}
async void main()
{
auto a = foo();
auto b = bar();
writeln("main");
writeln(await a + await b);
}
The output of the above would be:
bar
main
foo
3
The control flow is something like this:
1. `foo` is called
2. `foo` is awaiting for `sleep`
3. `sleep` returns a promise which is not fulfilled
4. This causes `foo` to suspend (return) and control comes back
to `main`
5. `bar` is called
6. `bar` has no suspension points (awaits) so this is more or
less a synchronous function
7. "bar" is printed
8. `bar` returns a fulfilled promise with the value `2`
9. Control comes back to `main`
10. "main" is printed
11. `main` awaits `a`. If the `a` promise is not fulfilled at
this point `main` is suspended
12. `foo` is resumed at some point in the future
13. "foo" is printed
14. `foo` returns a fulfilled promise with the value `1`
15. `main` is now resumed since `a` has been fulfilled
16. `main` awaits `b`
17. `b` is already fulfilled, which means `main` doesn't have to
suspend
18. The addition is performed
19. "3" is printed
I'm not entirely sure on when `foo` will be resumed. Probably
decided by a scheduler in the runtime.
To have the full experience of async/await, an event loop in the
runtime is necessary and non-blocking IO.
When a function is suspended, all its state (stack and registers)
need to be saved. When it's later resumed, the state need to be
restored. I'm not entirely sure how async/await functions are
different from fibers, which already exists in the D runtime.
--
/Jacob Carlborg
More information about the Digitalmars-d
mailing list