Doesn't that point to what libc had to do, growing async safe versions of functions which previously were not?
The innate complexity of coding to async is never going away. It's harder with or without language support, almost all of the time, because the concepts inherent in coding embody patterns which are simple, if they are the only sequence of execution flow, and which are innately more complicated to think about, if you have to encompass doing them (and other things) at the same time.
If this
then that
otherwise other
is always simpler than Try: this,
Except: but if it fails at some unknown point of continuing execution then this path out,
but meantime, lets progress that until we hit a point we have to rendezvous,
hey whats deadlock anyway??