草庐IT

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

coder 2023-09-19 原文

我已经尝试解决这个问题大约一个星期了。要么我遗漏了一些非常明显的东西,要么问题出在 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)

这是程序在运行时的行为方式。

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/

有关Python requests.get 持续超时大约一分钟,然后继续正常工作的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  5. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  6. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  7. ruby - 按值降序排列散列,然后按升序键入 ruby - 2

    我有这样的哈希trial_hash={"key1"=>1000,"key2"=>34,"key3"=>500,"key4"=>500,"key5"=>500,"key6"=>500}我按值降序排列:my_hash=trial_hash.sort_by{|k,v|v}.reverse我现在是这样理解的:[["key1",1000],["key4",500],["key5",500],["key6",500],["key3",500],["key2",34]]但我希望当值相同时按键的升序排序。我该怎么做?例如:上面的散列将以这种方式排序:[["key1",1000],["key3",500

  8. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  9. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  10. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

随机推荐