Polling и long polling

Чат-боты должны получать уведомления от соцсети моментально. Они не могут проверять обновления каждую секунду, это неэффективно. Большинство ответов от сервера будут неинформативны, вроде «У вас пока нет новых сообщений».

Такой подход, когда раз в n секунд опрашивается сторонний сервис, называется polling.

Чтобы сэкономить на ресурсах, можно использовать long polling. Устроен он так же, как и polling, с одним отличием: сервер дольше отвечает. Вообще, при лонг-поллинге сервер отвечает в двух случаях: или потому, что пришло новое сообщение, или потому, что соединение пора разрывать.

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

  1. Если за это время у меня не появится обновлений для клиента, я отвечу ему, что их нет.
  2. Если появятся, я отправлю ему обновления сразу, не дожидаясь таймаута.

Чтобы реализовать long polling на стороне клиента, нужно выставить большой timeout: 30 или 60 секунд.

Вот так выглядит polling со стороны клиента на Python:

from time import sleep
import requests

while True:
    response = requests.get("http://someurl.com")
    for message in response:
        bot.answer(message)
        sleep(1)

А вот так выглядит long polling:

import requests

while True:
    response = requests.get("http://someurl.com", timeout=60)
    for message in response:
        bot.answer(message)

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.