Как спроектировать контекстные менеджеры так, чтобы ресурсы гарантированно освобождались даже при отмене/исключениях (sync/async)?
Реализуйте __enter__/__exit__ или __aenter__/__aexit__, делайте освобождение идемпотентным и безопасным к повторному вызову, в __exit__ не глотайте исключения без нужды (возвращайте False). Для композиции используйте contextlib.ExitStack/AsyncExitStack, для потоков/соединений — async with/aclose. В корутинах без менеджера — try/finally. Критические закрытия при отмене можно кратко «экранировать» (shield) ради целостности.
Библиотека собеса по Python
Библиотека собеса по Python