Python-重复请求期间整个PC网络变慢

时间:2018-07-30 11:04:06

标签: python performance http https python-requests

首先,我是网络(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()'是否可以解决问题?

我什至不知道该怎么办才能解决问题。我必须至少重复几天才能重复请求。

谢谢。

1 个答案:

答案 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 ...