-
Notifications
You must be signed in to change notification settings - Fork 6
Open
Description
For asyncio, I believe best practice is to create a reference to all tasks you create to avoid garbage collection e.g. for a daemon instance:
task = self._loop.create_task(some_coro)Often, especially for short-lived tasks, we don't reference. I am unsure how important this practice actually is, but this has bitten us in the past (see, e.g. #77 ).
A simple object to keep track of these things e.g.
import asyncio
from typing import Coroutine
class TaskSet(set):
"""container class for tasks to keep strong references"""
def add(self, task:asyncio.Task):
super().add(task)
task.add_done_callback(self.discard)
def from_coro(self, coro:Coroutine):
"""create task and add to running loop"""
task = asyncio.get_running_loop().create_task(coro)
self.add(task)might be of general use? Would a helper class like this be useful to include in yaqd-core?
Such an item could be implemented for IsDaemon._tasks, but _tasks is currently a list, so (no change would give no support for append). Choice of set or list is probably not a big deal...
Metadata
Metadata
Assignees
Labels
No labels