Python get请求挂起长时间的api调用,即使api服务器端响应已完成

2024-09-30 20:33:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我看过每一篇相关的文章或答案,但都无法解决这个问题,我有一个python脚本,它按顺序调用一组api并将数据写入一个文件。有些api需要30-40分钟才能返回响应,有些返回结果需要毫秒。你知道吗

当我在本地的mac机器上运行这个python脚本时,它运行得很平稳,并且符合预期。 当我在远程Linux服务器上运行同一个脚本时,python脚本启动对api的调用,它启动第一个api,成功完成,然后启动第二个api,但之后再也没有完成,只是永远挂起。你知道吗

这些api完全可以从linux服务器访问,因此不存在访问问题。你知道吗

我改变了api调用的顺序,以检查某个api是否有问题,但所有api都正常工作。只是如果python脚本执行太长时间,它就会挂起。你知道吗

这是我的python文件测试.py你知道吗

import requests
import json, collections
import time

sourceDataApiBaseUrl = "https://apiserver.com/"
dataSinkBaseUrl = "/outputFolder"
jobs = [
    {"jobTitle":"API1","dataSourceApi":"api1/", "dataSinkFile": "1.csv"},
    {"jobTitle":"API2","dataSourceApi":"api2/", "dataSinkFile": "2.csv"},
    {"jobTitle":"API3","dataSourceApi":"api3/", "dataSinkFile": "3.csv"},
    {"jobTitle":"API4","dataSourceApi":"api4/", "dataSinkFile": "4.csv"},
    {"jobTitle":"API5","dataSourceApi":"api5/", "dataSinkFile": "5.csv"}
  ]

for job in jobs:
    print '\n'+job['jobTitle']+' job started..'

    # fetch data from the api
    print '   '+job['dataSourceApi']+' api started ...'
    step1Seconds = time.time()
    response = requests.get(sourceDataApiBaseUrl+job['dataSourceApi'])
    jsonResponse = json.loads(response.text, object_pairs_hook=collections.OrderedDict)
    print '   '+job['dataSourceApi']+' api completed, time taken in seconds='+str(time.time() - step1Seconds)

    csvContent = ""
    for myrow in jsonResponse:
        csvContent += '"'+'","'.join(myrow.values())+'"\n'
    csvContent = csvContent.rstrip("\n")

    print '   '+'file writing started ...'
    step2Seconds = time.time()
    f= open(dataSinkBaseUrl+"/"+job['dataSinkFile'],"w+")
    f.write(csvContent)
    f.close()
    print '   '+'file writing completed, records='+str(len(jsonResponse))+', time taken in seconds='+str(time.time() - step2Seconds)

p.S. 我还尝试向python添加超时请求。获取方法。我尝试设置更长的超时,比如3600秒,而实际完成api的时间大约是2400秒。在本例中,python在1h(3600s)后抛出读取超时。我检查了api服务器上的api调用日志,它在2400秒左右完成,但客户机从未得到响应并超时:(


Tags: csvinimport服务器脚本apitimejob