Hi Justin, Yes, we want to have TaskGroups in asyncio, and the only reason we didn't add them to Python 3.8 is that we also need to support ExceptionGroups (or MultiErrors). Nathaniel and I plan to start working on that.
Here's am implementation of TaskGroups that I created for EdgeDB https://github.com/edgedb/edgedb/blob/master/edb/common/taskgroup.py — you can use it in the meantime, it works just fine. Yury On Tue, Nov 26, 2019 at 3:45 PM, Justin Mayfield < too...@gmail.com > wrote: > > I'm curious if any work has happened towards supporting a grouping concept > like Yury has discussed with TaskGroup? I've been away from python for a > while and I'm finding that the use of gather and wait is trickier than I > remember it. My code tends to be inelegant when done as the docs > recommend (using create_task first, etc). I think I benefit from a class > based context manager primitive like TaskGroup. > > > > Side note, I find I'm missing Javascript's Promise.race() quite a bit too > (as_completed is often an aesthetic mismatch for my code), so it would be > neat if the TaskGroup behaved like a set of outstanding work with methods > like `race()` and `wait()`. > > > Somewhat related, I recently watched Nathaniel's talk on the happy > eyeballs algo ( https:/ / www. youtube. com/ watch?v=oLkfnc_UMcE ( > https://www.youtube.com/watch?v=oLkfnc_UMcE ) ) and I enjoyed the use of > this very easy to understand algo as the test basis for concurrency > designs. However when he described the problem my first instinct was that > he would the write algo in a top-down style where the outer blocks handled > scheduling and the inner tasks simply tried to do work or failed. It > seemed to me the use of events objects, scheduling the next task from > within an existing task (with conditions) and handling cleanup manually > via cancel calls was less than perfect and I dare say not dissimilar to > the reviled GOTO. Could this algo be written in even simpler terms? > Namely, without calls the any sort of cancel, without the tasks themselves > knowing anything about the outside scheduling or work set, and perhaps > most importantly without the use of Event objects which are champions of > the preemptive world IMO. > > > Please permit me to indulge in some hypothetical code I would like to be > able to write someday to perhaps highlight my wishlist for asyncio... > > > async def might_fail_or_be_slow (): > await asyncio. sleep ( random. random () * 10 ) > if random. random () > 0.5 : > raise Exception ( "job failed" ) > return "job worked" > > > async def happy_eyeballs ( max_job_wait = 0.200 ): > async with asyncio. group () as ag : > for i in range ( 10 ): > ag. add_task ( might_fail_or_be_slow ()) > try : > task = await ag. race ( timeout = max_job_wait ) > except asyncio. TimeoutError : > print ( "Nothing is ready yet, add another.." ) > else : > try : > return await task > except Exception : > print ( "Somebody failed, add another.." ) > raise Exception ( "nobody worked" ) > > > > > Some notes. This is obviously just pseudo code and I've not thought this > through very carefully so it's obviously rough and incomplete. For one, > I'm making the assumption here that the TaskGroup will be somewhat queue > like. E.g. if you call `race()` the result is removed from the group; > This might be silly or need to be more explicit, or maybe there could be a > multitude of grouping classes for each use-case TaskQueue, TaskGroup, > TaskRace, etc (spitballing). LIkewise it might be useful for the above > TaskGroup class to have `remove_task(task)` , `wait(timeout=None) -> > [tasks...]`, and perhaps even something like `results(timeout) -> [results > from tasks...]` which is a shortcut method for `results = [await t for t > in await group.wait()]`. > > > Cheers. > > > > > > > > > -- > You received this message because you are subscribed to the Google Groups > "python-tulip" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to python-tulip+unsubscribe@ googlegroups. com ( > python-tulip+unsubscr...@googlegroups.com ). > To view this discussion on the web visit https:/ / groups. google. com/ d/ > msgid/ python-tulip/ 54f410f6-b9b6-4af3-be29-c2e133fb7fe7%40googlegroups. com > ( > https://groups.google.com/d/msgid/python-tulip/54f410f6-b9b6-4af3-be29-c2e133fb7fe7%40googlegroups.com?utm_medium=email&utm_source=footer > ). > -- You received this message because you are subscribed to the Google Groups "python-tulip" group. To unsubscribe from this group and stop receiving emails from it, send an email to python-tulip+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/python-tulip/k3gf1sm6.3a8e58ab-eb46-4304-95b2-69f5e3418733%40we.are.superhuman.com.