|
@@ -1,4 +1,4 @@
|
|
|
-'''inspired from https://quantlane.com/blog/ensure-asyncio-task-exceptions-get-logged/'''
|
|
|
+"""inspired from https://quantlane.com/blog/ensure-asyncio-task-exceptions-get-logged/"""
|
|
|
import asyncio
|
|
|
import sys
|
|
|
from typing import Awaitable, Dict, Set, TypeVar
|
|
@@ -15,12 +15,12 @@ lazy_tasks_waiting: Dict[str, Awaitable[T]] = {}
|
|
|
|
|
|
|
|
|
def create(coroutine: Awaitable[T], *, name: str = 'unnamed task') -> 'asyncio.Task[T]':
|
|
|
- '''Wraps a loop.create_task call and ensures there is an exception handler added to the task.
|
|
|
+ """Wraps a loop.create_task call and ensures there is an exception handler added to the task.
|
|
|
|
|
|
If the task raises an exception, it is logged and handled by the global exception handlers.
|
|
|
Also a reference to the task is kept until it is done, so that the task is not garbage collected mid-execution.
|
|
|
See https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task.
|
|
|
- '''
|
|
|
+ """
|
|
|
task = globals.loop.create_task(coroutine, name=name) if name_supported else globals.loop.create_task(coroutine)
|
|
|
task.add_done_callback(_handle_task_result)
|
|
|
running_tasks.add(task)
|
|
@@ -28,11 +28,11 @@ def create(coroutine: Awaitable[T], *, name: str = 'unnamed task') -> 'asyncio.T
|
|
|
return task
|
|
|
|
|
|
|
|
|
-def create_lazy(coroutine: Awaitable[T], *, name: str) -> 'asyncio.Task[T]':
|
|
|
- '''Wraps a create call and ensures a second task with the same name is delayed until the first one is done.
|
|
|
+def create_lazy(coroutine: Awaitable[T], *, name: str) -> None:
|
|
|
+ """Wraps a create call and ensures a second task with the same name is delayed until the first one is done.
|
|
|
|
|
|
If a third task with the same name is created while the first one is still running, the second one is discarded.
|
|
|
- '''
|
|
|
+ """
|
|
|
if name in lazy_tasks_running:
|
|
|
lazy_tasks_waiting[name] = coroutine
|
|
|
return
|