The asyncio package already has this functionality; check out wait() (it has various options), as_completed(), gather().

On Sat, May 2, 2015 at 2:24 PM, Piotr Jurkiewicz <piotr.jerzy.jurkiewicz@gmail.com> wrote:
There are three modes in which you can await multiple coroutines:
- iterate over results as they become ready
- await till all are done
- await till any is done

For example C# has helper functions WhenAll and WhenAny for that:

    await Task.WhenAll(tasks_list);
    await Task.WhenAny(tasks_list);

I can imagine the set of three functions being exposed to user to control waiting for multiple coroutines:

asynctools.as_done()  # returns asynchronous iterator for iterating over the results of coroutines as they complete

asynctools.all_done() # returns a future aggregating results from the given coroutine objects, which awaited returns list of results (like asyncio.gather())

asynctools.any_done() # returns a future, which awaited returns result of first completed coroutine

Example:

    from asynctools import as_done, all_done, any_done

    corobj0 = async_sql_query("SELECT...")
    corobj1 = async_memcached_get("someid")
    corobj2 = async_http_get("http://python.org")

    # ------------------------------------------------

    # Iterate over results as coroutines complete
    # using async iterator

    await for result in as_done([corobj0, corobj1, corobj2]):
        print(result)

    # ------------------------------------------------

    # Await for results of all coroutines
    # using async iterator

    results = []
    await for result in as_done([corobj0, corobj1, corobj2]):
        results.append(result)

    # or using shorthand all_done()

    results = await all_done([corobj0, corobj1, corobj2])

    # ------------------------------------------------

    # Await for a result of first completed coroutine
    # using async iterator

    await for result in as_done([corobj0, corobj1, corobj2]):
        first_result = result
        break

    # or using shorthand any_done()

    first_result = await any_done([corobj0, corobj1, corobj2])

Piotr

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/



--
--Guido van Rossum (python.org/~guido)