У меня есть менеджер контекста, который используется следующим образом:
async with await MyContextManager() as cm:
# cm is now doing heavy processing in the background until
# it's told to stop...
await asyncio.sleep(1) # simulate doing other things while
# cm continues to process
# more processing
await cm.change_behavior()
# cm is now has even more work that it's processing...
while True:
await asyncio.sleep(1)
# cm just continues until it's told to stop, so this
# loop ensures it never stops
Если MyContextManager.change_behavior()
выдает исключение, все хорошо, вызывающий может его перехватить или проигнорировать или что-то еще. Но что, если диспетчеру контекста нужно вызвать исключение во время sleep()
вызывающего блока? Другими словами, если это долгоживущий фоновый процесс, который сталкивается с ошибкой, как я могу уведомить блок with
об исключении?
Увеличенное изображение
Диспетчер контекста в этом случае является в основном контроллером связи. Сообщения принимаются и отправляются и т. Д. Процесс вызова в основном заботится только о том, что менеджер контекста делает свое дело, но также иногда отправляет сообщения в КМ, чтобы изменить состояние связи. Что мне нужно, так это возможность узнать, что менеджер контекста работает успешно, или выйти из блока кода, если что-то пойдет не так.