Протокол продолжительности жизни

Версия: 2.0 (2019-03-20)

Спецификация Lifespan ASGI описывает, как передавать в ASGI события, связанные с продолжительностью жизни, такие как запуск и выключение. Это относится к продолжительности жизни основного цикла событий. В многопроцессной среде в каждом процессе будут происходить события времени жизни.

Сообщения о времени жизни позволяют приложению инициализировать и завершать работу в контексте запущенного цикла событий. Примером может служить создание пула соединений и последующее закрытие пула соединений для освобождения соединений.

Возможная реализация этого протокола приведена ниже:

async def app(scope, receive, send):
    if scope['type'] == 'lifespan':
        while True:
            message = await receive()
            if message['type'] == 'lifespan.startup':
                ... # Do some startup here!
                await send({'type': 'lifespan.startup.complete'})
            elif message['type'] == 'lifespan.shutdown':
                ... # Do some shutdown here!
                await send({'type': 'lifespan.shutdown.complete'})
                return
    else:
        pass # Handle other types

Область применения

Область действия существует в течение всего цикла событий. Сама область содержит основные метаданные:

  • type (Unicode string) – "lifespan".

  • asgi["version"] (Unicode string) – Версия спецификации ASGI.

  • asgi["spec_version"] (Unicode string) – Используемая версия данной спецификации. Необязательно; по умолчанию "1.0".

Если при вызове вызываемой прикладной программы с сообщением lifespan.startup или областью видимости с типом lifespan возникает исключение, сервер должен продолжить работу, но не посылать никаких событий lifespan.

Это позволяет обеспечить совместимость с приложениями, которые не поддерживают протокол lifespan. Если вы хотите зарегистрировать ошибку, возникающую во время запуска lifespan и не позволяющую серверу запуститься, то вместо этого отправьте обратно lifespan.startup.failed.

Стартап

Отправляется, когда сервер готов к запуску и приему соединений, но еще до того, как он начал это делать.

Ключи:

  • type (Unicode string) – "lifespan.startup".

Ввод в эксплуатацию завершен

Отправляется приложением, когда оно завершило запуск. Сервер должен дождаться этого сообщения, прежде чем начать обработку соединений.

Ключи:

  • type (Unicode string) – "lifespan.startup.complete".

Запуск не удался

Отправляется приложением, когда ему не удалось завершить запуск. Если сервер видит это, он должен записать в журнал/напечатать сообщение, а затем выйти.

Ключи:

  • type (Unicode string) – "lifespan.startup.failed".

  • message (строка Unicode) – Необязательно; по умолчанию "".

Выключение

Отправляется, когда сервер прекратил принимать соединения и закрыл все активные соединения.

Ключи:

  • type (Unicode string) – "lifespan.shutdown".

Выключение завершено

Отправляется приложением, когда оно завершило свою очистку. Сервер должен дождаться этого сообщения перед завершением работы.

Ключи:

  • type (Unicode string) – "lifespan.shutdown.complete".

Выключение не произошло

Отправляется приложением, когда ему не удалось завершить очистку. Если сервер видит это, он должен записать в журнал/напечатать сообщение, а затем завершить работу.

Ключи:

  • type (Unicode string) – "lifespan.shutdown.failed".

  • message (строка Unicode) – Необязательно; по умолчанию "".

История версий

  • 2.0 (2019-03-04): Добавлены startup.failed и shutdown.failed, уточнена обработка исключений на этапе запуска.

  • 1.0 (2018-09-06): Обновлена спецификация ASGI с протоколом жизни.

Вернуться на верх