Python - вся компьютерная сеть замедляется во время повторного запроса

1

Прежде всего, я новичок в сети (HTTP-связь) и Python.

В настоящее время я использую запросы и потоковый модуль для периодической отправки или получения данных с определенного сайта. Целевым сайтом является " https://api.coinone.co.kr ", но я думаю, что здесь это неважно.

В приведенном ниже примере кода я позволяю Python извлекать данные каждые 1 секунду. Сначала это работает очень хорошо. Каждый запрос занимает около 0,07 с на моем компьютере.

import requests
import time
import threading

url0 = 'https://api.coinone.co.kr/ticker/'


class Fetch:
    def __init__(self):
        self.thread = threading.Thread(target=self.fcn)
        self.t0 = time.perf_counter()
        self.period = 1
        self.req0 = None

    def fcn(self):
        while True:
            # headers = None
            headers = {'Connection': 'close'}

            # requests
            t0 = time.perf_counter()
            req0 = requests.get(url0, headers=headers, params={'currency': 'all'})
            resp0 = req0.json()
            self.req0 = req0
            reqTimeInt0 = time.perf_counter() - t0

            # prints
            print('elapsed time: %0.3f' % t0)
            # print(req0.request.headers)
            print(resp0['result'])
            print('requests time interval: %0.3f' % reqTimeInt0)
            print('')

            # timer
            self.t0 += self.period
            now = time.perf_counter()
            sleepInterval = self.t0 - now
            if sleepInterval > 0:
                time.sleep(sleepInterval)
            else:
                while self.t0 - now <= 0:
                    self.t0 += self.period


f1 = Fetch()
f1.thread.start()

Но с течением времени увеличивается время, необходимое для каждого "http get". Примерно через 3 часа один запрос занимает 0,80 с, где он в 10 раз больше, чем в начальном состоянии. Кроме того, запрос Python не только замедляется, но и вся сеть ПК становится медленнее (включая интернет-просмотр) без увеличения количества ресурсов ЦП, ОЗУ и использования сети. Закрытие консоли не возвращает нормальную скорость сети, и я должен перезагрузить компьютер. В любом случае, после перезагрузки, сеть полностью восстановилась, и Интернет работает нормально.

Кажется, что некоторые нагрузки в сетевом соединении накапливаются при каждом запросе Python. Поэтому я попытался добавить в заголовок "Connection: close", но это не сработало. Will 'request.Session()' исправить проблему?

Я даже не знаю, что делать, чтобы понять проблему. Я должен повторять запросы в течение как минимум нескольких дней, не нарушая соединение.

Спасибо.

  • 1
    проверьте вывод netstat -n в момент замедления. Возможно, у вас слишком много открытых соединений или слишком много из них находятся в состоянии FIN_WAIT. Похоже, это не проблема с питоном, а обычная проблема уровня системного администратора.
  • 1
    Если вы остановите и перезапустите сценарий, время запроса немедленно уменьшится примерно до 0,07 с? Похоже, что используемый вами API может ограничивать ваши запросы.
Показать ещё 2 комментария
Теги:
python-requests
performance
http
https

1 ответ

0

Используйте сеанс, так как он не будет открывать новые сетевые подключения, просто используйте один, чтобы выполнить все запросы.

Существуют предпочтительные модификации:

class Fetch:
    def __init__(self):
        self.session = requests.Session
        self.thread = threading.Thread(target=self.fcn)
        self.t0 = time.perf_counter()
        self.period = 1
        self.req0 = None

    def fcn(self):
        while True:
            # headers = None
            headers = {'Connection': 'close'}

            # requests
            t0 = time.perf_counter()
            req0 = self.session.get(url0, headers=headers, params={'currency': 'all'})
            resp0 = req0.json()
            self.req0 = req0

            ... other codes goes there ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню