Что-то подобное уже существует?
Не сейчас, но это очень полезная идея. Более общая версия концепции будет добавлена в Python 3.8 в форме класса TaskGroup
, созданного на основе предшествующего уровня техники в Curio и Trio .
Я бы предложил расширить реализацию, чтобы использовать finally
, предоставляя гарантию того, что фоновая задача будет ожидаться даже в случае исключения; например:
@asynccontextmanager
async def run_in_background(coro):
task = asyncio.create_task(coro)
try:
yield task
finally:
await task
Если нет, то считается ли это более питонским или менее питонским, чем существующий способ?
Эта часть вопроса, очевидно, основана на мнении, но я бы сказал, что менеджер контекста более Pythonic, потому что он гарантирует , что фоновая задача выполнена и ожидается к тому времени, когда блок оставлен. Это также гарантирует, что исключения в фоновой задаче не будут передаваться без вывода сообщений , что является частым источником ошибок в асинхронном коде.