In the begininning there was main() and that was good. But under the surface that has changed, it’s still main() but what really happens is dynamic linking, exit handling resources… We’re even throwing garbage collection in for good luck. But, it’s still main().
If you do anything that’s isn’t linear programming you see that ioloop() is really main and you have boilerplate to set up everything for your call to the ioloop(). So, now main isn’t really important we’re boiler plating main() into a bunch of work for ioloop()… But, alas the languages don’t support this, sometimes you can do things like
@gen.engine def fizzle(self): result = yield gen.Task(some_function, args)
Why should I do all that – if the language assumed all IO operations needed to yield to ioloop() the syntax would support that model. You wouldn’t need to worry about what was sync and async, you wouldn’t need to wrap and decorate. It would just be good.
Imagine- open(), read(), write() socket(), connect() all assumed they were async and would default yield to the ioloop…
Now to write this language… Maybe I’ll call it “eve”, but the $64k question is compiled or interpreted…
Update: This really is the “async” that is proposed for Python 3.5 – hope it makes it.