Second Draft: Coroutines
Jin
nin-jin at ya.ru
Tue Jan 28 16:31:35 UTC 2025
On Friday, 24 January 2025 at 04:32:21 UTC, Mai Lapyst wrote:
> I think you have a misunderstanding (or mutliple here). Nobody
> here want's to take away threads or fibers from the language.
This is not the first day in programming and, unfortunately, I
know perfectly well how the Overton window works:
- No one will suffer from another feature X. Do not want to - do
not use.
- Here you have a new API / library, but it is available only
through X. Please rewrite part of your code through X.
- There are too many crutches for X in the code. In order to get
rid of them, you need to rewrite your entire code on X.
- X is actively supported, while the “outdated” mode of operation
is drowned in problems that have not been repaired for years,
some of which appeared during the implementation of X.
- At some point, the code without X simply stops working and you
have no choice completely left. See the example:
https://www.npmjs.com/package/fibers
> Benchmarking is always only as good and usefull when used in
> the right environments. I can easily create benchmarks that
> also show how "slow" fibers are and how "fast" async is, as
> well as otherwise.
When the smart indicates the problem, the fool looks at the
finger.
Asynchronous function can not be inlined at the place of use and
use a faster allocation on the stack. Benchmark only shows that
even the coolest modern JIT compilers are not able to optimize
them.
> Just go ahead and try re-implementing it with fibers or OS
> Threads where every call to `fib(n)` spawns a new thread and
> joins it. I think anyone would agree that thats just insane
> waste of performance, which it rightfully is! Nobody in their
> right mind would try to calculate it in parallel because its
> still only a "simple" calculation.
You either decisively do not understand what you are talking
about, or do intentional demagogy. Both options do not honor you.
Where one single fiber will have a dozen fast calls and the
optional one yield somewhere in the depths, with async functions
you will have a dozen slow asynchronous calls, even if no
asynchrony (for example, because caching) will not be required.
> This need only arises from poorly used global variables /
> "impure" code, as the example you reference very good
> demonstrates;
Any useful code is not pure. You either did not understand the
problem that AsyncContext solves, or did not try to understand.
Global (or rather Thread/Fiber Local) variables are used for
special programming techniques that allow you to write a simpler,
more reliable and effective code. I will not carry out a lecture
on reactive programming, logging in exceptional situations and
tracking user actions. See this series for example:
https://dev.to/ninjin/perfect-reactive-dependency-tracking-85e
Concurrent access to variables with multi-threading has nothing
to do with it.
More information about the dip.development
mailing list