Как закрыть доступное соединение из-под контроля? - PullRequest
0 голосов
/ 02 мая 2019

Я построил лямбда-функцию для AWS в Python, которая использует aiohttp для выполнения некоторых запросов.

Как указано в документации AWS ,

Любые объявления в вашем коде функции Lambda (вне кода обработчика, см. Модель программирования) остаются инициализированными, обеспечивая дополнительную оптимизацию при повторном вызове функции. Например, если ваша функция Lambda устанавливает соединение с базой данных, а не восстанавливает соединение, исходное соединение используется в последующих вызовах.

поэтому я поместил aiohttp.ClientSession() вне функции дескриптора, так что она может быть повторно использована будущими лямбда-функциями:

http_session = None

def handle(event, context):
    global http_session

    # http_session will be not None if context is reused
    if http_session is None:
        http_session = aiohttp.ClientSession()

    # [...] Use http_session here

Однако я должен закрыть соединение с await session.close() после того, как оно больше не используется, то есть когда контекст отбрасывается. Я не могу закрыть http_session в пределах handle, потому что это полностью аннулирует возможность повторного использования соединения.

Учитывая это, какие варианты у меня есть?

  1. Просто позвольте соединению открыться, и в какой-то момент оно закроется само.
  2. Существует способ выполнения определенного кода при удалении контекста.
  3. Нет способа делать то, что я хочу.

Спасибо, заранее.

1 Ответ

1 голос
/ 03 мая 2019

Однако я должен закрыть соединение с помощью await session.close () после того, как он больше не используется, то есть когда контекст отбрасывается. Я не могу закрыть http_session в дескрипторе, потому что это полностью аннулирует возможность повторного использования соединения.

Да, все верно. Если вы закроете его, это не постоянное соединение.

  1. Существует способ выполнения определенного кода при удалении контекста.

Я никогда не слышал о ловушке контекста. Также не нашел ничего подобного в документации aws.

  1. Просто позвольте соединению открыться, и оно в какой-то момент закроется само собой.

Вот как это происходило в моей компании прямо сейчас, и в большинстве примеров, которые я нашел в интернете. Довольно безопасно оставить соединение открытым. Сервер закрывает соединение, если через некоторое время оно не используется. Время, после которого соединение закрывается (тайм-аут проверки активности), настраивается на стороне сервера. Значение по умолчанию отличается для каждого сервера. Например. для apache это всего 5-10 секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...