Прежде всего, я новичок в сети (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()' исправить проблему?
Я даже не знаю, что делать, чтобы понять проблему. Я должен повторять запросы в течение как минимум нескольких дней, не нарушая соединение.
Спасибо.
Используйте сеанс, так как он не будет открывать новые сетевые подключения, просто используйте один, чтобы выполнить все запросы.
Существуют предпочтительные модификации:
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 ...
netstat -n
в момент замедления. Возможно, у вас слишком много открытых соединений или слишком много из них находятся в состоянии FIN_WAIT. Похоже, это не проблема с питоном, а обычная проблема уровня системного администратора.