Предположим, небольшое приложение на Python одновременно получает измерения и веса, а затем вычисляет по ним одну оценку. Одна операция выбрасывает исключение, пока другая ещё выполняется. Какой жизненный цикл нужен этому вычислению, прежде чем сравнивать способы записи конкурентной работы в разных языках?
Сначала я бы определил, делает ли сбой одной операции всё вычисление невозможным. В asyncio.TaskGroup ошибка участника, отличная от CancelledError, приводит к отмене остальных участников, а завершение выхода из группы дожидается её задач. Один лишь вызов корутинной функции не планирует эту работу. Операции получения данных нужно оформить как задачи группы.
Затем возникает отдельный вопрос о готовности данных. Если обе задачи вернули значения обычным образом, но веса непригодны, сбор завершён, однако оснований начинать расчёт ещё нет. Следует отклонить входные данные, запросить замену или выдать частичный результат? TaskGroup эту политику не выбирает.
Я бы также проверил, что должна делать отмена со стороны вызывающего кода и сохраняется ли она при очистке ресурсов благодаря передаче CancelledError дальше. Подавление этого исключения может нарушить механизм отмены группы.
Для этого приложения я бы выбрал TaskGroup, если сбой любой операции должен завершать общий запрос, а выход из области должен дожидаться её участников. Затем проверил бы возвращённые данные перед расчётом. Такие требования дают конкретный ориентир для сравнения языков.
