我使用并发期货使用API从远程服务器下载报告。为了通知我报告已正确下载,我只需要打印出ID的功能。
我有一个问题,很少有报道下载会挂起 - 肯定。我没有收到超时错误或连接重置错误,只是挂了几个小时,直到我杀死整个过程。这是API的已知问题,没有已知的解决方法。
我做了一些研究,并转而使用基于Pebble的方法来实现函数的超时。我的目标是记录无法下载并重新开始的报告的ID。
不幸的是,我遇到了一些砖墙,因为我不知道如何实际检索我无法下载的报告的ID。我使用类似的布局来this答案:
from pebble import ProcessPool
from concurrent.futures import TimeoutError
def sometimes_stalling_download_function(report_id):
...
return report_id
with ProcessPool() as pool:
future = pool.map(sometimes_stalling_download_function, report_id_list, timeout=10)
iterator = future.result()
while True:
try:
result = next(iterator)
except StopIteration:
break
except TimeoutError as error:
print("function took longer than %d seconds" % error.args[1])
#Retrieve report ID here
failed_accounts.append(result)
我想要做的是在超时的情况下检索报告ID,但似乎无法从该异常中获取。在超时异常的情况下,是否可以让函数输出ID?或者我是否必须重新考虑如何完全下载报告?
map函数返回一个future
对象,该对象按照提交的顺序生成结果。
因此,要了解哪个report_id
导致超时,您可以简单地检查它在report_id_list
中的位置。
index = 0
while True:
try:
result = next(iterator)
except StopIteration:
break
except TimeoutError as error:
print("function took longer than %d seconds" % error.args[1])
#Retrieve report ID here
failed_accounts.append(report_id_list[index])
finally:
index += 1