gpt4 book ai didi

Python requests.get 持续超时大约一分钟,然后继续正常工作

转载 作者:可可西里 更新时间:2023-11-01 02:52:04 24 4
gpt4 key购买 nike

我已经尝试解决这个问题大约一个星期了。要么我遗漏了一些非常明显的东西,要么问题出在 API 的服务器端,要么服务器故意拖延我(我用 python 编码)。

我正在尝试做的事情:

  1. 我正在尝试获取财务数据(针对所有市场的更好的市场深度)。问题是交易所服务的 api 只支持获取一个市场的数据(总共大约 75-85,可变)所以我决定为每个市场启动一个线程
  2. 每个线程将处理一个市场,尝试获取该市场的数据,如果成功则返回,如果不成功则将市场添加回队列以供稍后由新线程处理
  3. 这样做直到涵盖所有市场,并无限期重复以保持数据最新

我使用请求库用 python 编写了这个代码。它在几次迭代中工作正常,但随后服务器停止响应。为了克服这个问题,我向 requests.get 添加了超时。它超时,但服务器在大约 1 分钟内也不响应新查询。然后一切都再次顺利进行几次迭代,然后事情停滞,如此重复。

这是python代码。

import requests, json
import thread, threading
from time import sleep, clock


#Get queue
conn = requests.get('http://data.bter.com/api/1/pairs/')
mainQueue = json.loads(conn.content)
conn.close()


#Variable globals
marketCount = 0
queue = mainQueue[:]


#Static globals
lock = threading.Lock()
completeSize = len(queue)


def getOrderData(marketid):
global queue, marketCount

try:
data = requests.get(str('http://data.bter.com/api/1/depth/'
+marketid), timeout = 3)
except:
with lock:
print "Timed out: %s" % marketid
queue.append(marketid)
return

with lock:
marketCount += 1
data.close()
return


while True:
print "##################################"

#Initialize data
crT = clock()
marketCount = 0
queue = mainQueue[:]


#Start retrieving all markets
while marketCount != completeSize:
while len(queue) == 0 and marketCount != completeSize:
sleep(0.01)

if marketCount != completeSize:
marketid = queue.pop(0)
thread.start_new_thread(getOrderData, (marketid,))

#Print time spent
print "Finished, total time:",clock()-crT
sleep(1)

这是程序在运行时的行为方式。 Here is the way program behaves during runtime.

Finished 表示我一次获取了所有的财务数据,并再次开始更新。如您所见,似乎一切正常,然后开始停滞、超时。突然间,一切又开始正常工作了。我还注意到,在我用data.close()关闭get连接后,状态为TIME_WAIT的tcp连接在tcp监控程序中停留了很长时间。几次迭代后,有 TONS 个,只是等待 TIME_WAIT 状态。

所以,这是我的问题

  1. 是否有可能,在所有保持在 TIME_WAIT 状态的 TCP 连接中,正在等待服务器向它们发送某种信号以释放它们?如果是这样,服务器是否可能因为我同时有太多(事件?事件?)连接而停止响应我?
  2. 如果不是,为什么我的所有 get 请求都会超时?是因为服务器可能对每个客户端每分钟的查询有限制吗?当我到达那个位置时,大约一分钟后,它神奇地再次开始正常工作,
  3. 我有 TONS 和 TONS 的 TCP 连接在 TIME_WAIT 状态等待,并且它们不断累积。 (我开始大约每秒 80 个连接。如果 4 分钟是连接完全释放所需的时间,那将累积 19200 个连接)如何解决这个问题,这是一个问题吗?
  4. 我启动了很多线程。有问题吗?
  5. 以线性方式获取所有数据,一个又一个市场不是一种选择,太慢了,数据会过时。我可以通过任何其他方式使整个市场数据保持最新吗?(最多 3 秒)
  6. 你还有什么想告诉我的吗?

我知道我的代码还没有保存数据。我只是想先得到它。代码很糟糕,但由于我正在测试一个简短的片段,所以我没有费心去评论(我为了找到一种方法而多次更改它)

提前致谢。我真的希望我能克服这个问题。

最佳答案

您正在非常频繁地执行请求,这很可能是服务器不允许的。他们可能使用的技术称为节流,看看http://www.django-rest-framework.org/api-guide/throttling ,他们对此有很好的解释。

关于Python requests.get 持续超时大约一分钟,然后继续正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21997158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com