首先,我是网络(HTTP通信)和Python的新手。
我目前正在使用请求和线程模块来定期发送或接收特定站点的数据。目标站点是“ https://api.coinone.co.kr”,但我认为这里没有关系。
通过下面的示例代码,我让Python每1秒获取一次数据。起初,它运作良好。每个请求在我的计算机上大约需要0.07 s。
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请求变慢,而且整个PC网络变慢(包括Internet浏览),而CPU,RAM资源和网络使用量均未增加。关闭控制台不能使网络速度恢复正常,我必须重新启动PC。无论如何,重新启动后,网络将完全恢复并且互联网可以正常工作。
似乎每个Python请求都会累积一些网络连接负担。因此,我尝试在标头上添加“ Connection:close”,但没有成功。 'requests.Session()'是否可以解决问题?
我什至不知道该怎么办才能解决问题。我必须至少重复几天才能重复请求。
谢谢。
答案 0 :(得分: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 ...