Most active commenters

    ←back to thread

    320 points willm | 12 comments | | HN request time: 1.735s | source | bottom
    Show context
    atomicnumber3 ◴[] No.45106455[source]
    The author gets close to what I think the root problem is, but doesn't call it out.

    The truth is that in python, async was too little, too late. By the time it was introduced, most people who actually needed to do lots of io concurrently had their own workarounds (forking, etc) and people who didn't actually need it had found out how to get by without it (multiprocessing etc).

    Meanwhile, go showed us what good green threads can look like. Then java did it too. Meanwhile, js had better async support the whole time. But all it did was show us that async code just plain sucks compared to green thread code that can just block, instead of having to do the async dances.

    So, why engage with it when you already had good solutions?

    replies(24): >>45106558 #>>45106616 #>>45106659 #>>45106663 #>>45106684 #>>45106758 #>>45107048 #>>45107148 #>>45107247 #>>45107394 #>>45107701 #>>45107865 #>>45108486 #>>45108978 #>>45109142 #>>45109610 #>>45109958 #>>45110033 #>>45110052 #>>45110805 #>>45111877 #>>45111901 #>>45113010 #>>45113188 #
    1. pnathan ◴[] No.45107148[source]
    Async taints code, and async/await fall prey to classic cooperative multitasking issues. "What do you mean that this blocked that?"

    The memory and execution model for higher level work needs to not have async. Go is the canonical example of it done well from the user standpoint IMO.

    replies(2): >>45108994 #>>45110383 #
    2. hinkley ◴[] No.45108994[source]
    The function color thing is a real concern. Am I wrong or did a python user originally coin that idea?
    replies(1): >>45109738 #
    3. throwawayffffas ◴[] No.45109738[source]
    No it was a js dev complaining about callbacks in node. Mainly because a lot of standard library code back then only came in callback flavour. i.e. no sync file writes, etc.
    replies(2): >>45110108 #>>45110369 #
    4. LtWorf ◴[] No.45110108{3}[source]
    Which is really funny because the linux kernel doesn't do async for file writes :D
    replies(1): >>45112644 #
    5. munificent ◴[] No.45110369{3}[source]
    I wrote it. :)

    Actually, I was and am primarily a Dart developer, not a JS developer. But function color is a problem in any language that uses that style of asynchrony: JS, Dart, etc.

    6. meowface ◴[] No.45110383[source]
    gevent has been in Python for ages and still works great. It basically adds goroutine-like green thread support to the language. I still generally start new projects with gevent instead of asyncio, and I think I always will.
    replies(1): >>45110681 #
    7. pdonis ◴[] No.45110681[source]
    I've used gevent and I agree it works well. It has prevented me from even trying to experiment with the async/await syntax in Python for anything significant.

    However, gevent has to do its magic by monkeypatching. Wanting to avoid that, IIRC, was a significant reason why the async/await syntax and the underlying runtime implementation was developed for Python.

    Another significant reason, of course, was wanting to make async functions look more like sync functions, instead of having to be written very differently from the ground up. Unfortunately, requiring the "async" keyword for any async function seriously detracted from that goal.

    To me, async functions should have worked like generator functions: when generators were introduced into Python, you didn't have to write "gen def" or something like it instead of just "def" to declare one. If the function had the "yield" keyword in it, it was a generator. Similarly, if a function has the "await" keyword in it, it should just automatically be an async function, without having to use "async def" to declare it.

    replies(1): >>45112022 #
    8. krmboya ◴[] No.45112022{3}[source]
    Would this result in surprises like if a function is turned to async by adding an await keyword, all of a sudden all functions that have it in their call stack become async
    replies(1): >>45118182 #
    9. yxhuvud ◴[] No.45112644{4}[source]
    Uh, io_uring does that just fine.
    replies(1): >>45112649 #
    10. LtWorf ◴[] No.45112649{5}[source]
    That's yet another thing though.
    replies(1): >>45135437 #
    11. pdonis ◴[] No.45118182{4}[source]
    It would work the same as it works now for generators. A function that calls a generator function isn't a generator just because of that; it only is if it also has the yield keyword in it (or yield from, which is a way of chaining generators).

    Similarly, a function that calls an async function wouldn't itself be async unless it also had the await keyword. But of course the usual way of calling an async function would be to await it. And calling it without awaiting it wouldn't return a value, just as with a generator; calling a generator function without yielding from it returns a generator object, and calling an async function without awaiting it would return a future object. You could then await the future later, or pass it to some other function that awaited it.

    12. yxhuvud ◴[] No.45135437{6}[source]
    It is part of the kernel and it does async file writes, so I don't really understand your objection.