Excellent,

I'll have a look, thanks for the response.


On Tue, Nov 26, 2019 at 3:14 PM Yury Selivanov <yseliva...@gmail.com> wrote:

> 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) 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+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 a topic in the
> Google Groups "python-tulip" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/python-tulip/dsv_PDcqvsw/unsubscribe.
> To unsubscribe from this group and all its topics, 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
> <https://groups.google.com/d/msgid/python-tulip/k3gf1sm6.3a8e58ab-eb46-4304-95b2-69f5e3418733%40we.are.superhuman.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/CAHxQA0HT823kbeo8gjh2L4Dfh44BWF%2BVO3JwHi_jVT-w3CBEVg%40mail.gmail.com.

Reply via email to