Я просмотрел каждую связанную статью или ответ, но не смог решить эту проблему. У меня есть скрипт на python, который последовательно вызывает набор apis и записывает данные в файл. Некоторым apis требуется время, чтобы вернуть ответ через ~ 30-40 минут, а некоторые возвращают результаты в миллисекундах.
Когда я запускаю этот скрипт python на моем локальном компьютере Mac, он работает гладко и по назначению. Когда я запускаю тот же сценарий на удаленном сервере Linux, сценарии python инициируют вызов API, он запускает первый API, успешно завершает и затем запускает второй API, но никогда не завершает после этого и просто зависает навсегда.
API полностью доступны с сервера linux, поэтому проблем с доступом нет.
Я манипулировал последовательностью вызовов API, чтобы проверить, есть ли проблемы с определенным API, но все API работают. Просто если скрипт python выполняется слишком долго, он просто зависает.
Вот мой файл python test.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)
PS Я также попытался добавить таймаут вметод python request.get. Я попытался установить более длительное время ожидания, скажем, 3600 секунд, в то время как фактическое время завершения API составляет около 2400 секунд. В этом случае python выбрасывает тайм-аут чтения через 1 час (3600 секунд). Я проверил журналы вызовов API на сервере API, и он завершился примерно через 2400 секунд, но клиент так и не получил ответ и время истекло: (