lbry-sdk/lbry/tasks.py

34 lines
800 B
Python
Raw Normal View History

2020-08-20 16:43:44 +02:00
from asyncio import Event, get_running_loop
2018-12-07 02:03:22 +01:00
class TaskGroup:
def __init__(self, loop=None):
2020-08-20 16:43:44 +02:00
self._loop = loop or get_running_loop()
2018-12-07 02:03:22 +01:00
self._tasks = set()
self.done = Event()
self.started = Event()
2018-12-07 02:03:22 +01:00
2020-03-24 04:54:55 +01:00
def __len__(self):
return len(self._tasks)
2018-12-07 02:03:22 +01:00
def add(self, coro):
task = self._loop.create_task(coro)
self._tasks.add(task)
self.started.set()
2018-12-07 02:03:22 +01:00
self.done.clear()
task.add_done_callback(self._remove)
return task
def _remove(self, task):
self._tasks.remove(task)
if len(self._tasks) < 1:
self.done.set()
self.started.clear()
2018-12-07 02:03:22 +01:00
def cancel(self):
for task in self._tasks:
task.cancel()
self.done.set()
self.started.clear()