Swift网络呼叫:延迟不断增加,最终请求超时



我正在做一个需要大量使用api的Swift项目。一切工作正常,但有时,我得到Code=-1001"请求超时"错误,而调用API。为了正确测试它,我使用循环并迭代1000次,调用相同的API。

我正在使用公共API。API是

let apiString = "https://oc-index.library.ubc.ca"

而我的循环是

for i in 0 ..< 1000 {
    Alamofire.request(.POST, apiString).responseJSON { response in
        print(response.debugDescription)
        if response.result.isFailure {
            print("Failure")
        }
    }
}

现在,当检查打印响应时,我看到延迟在每个新的api响应上增加,并达到60.14秒,最后是请求超时。第一次调用API时,延迟时间为2.225秒,日志中的时间轴,最后一次成功调用API的延迟时间为60.14秒。

API在循环中第一次被命中时的时间轴(当i = 1时)。

[Timeline]: Timeline: { "Request Start Time": 493671593.424, "Initial Response Time": 493671595.649, "Request Completed Time": 493671595.684, "Serialization Completed Time": 493671595.688, "Latency": 2.225 secs, "Request Duration": 2.260 secs, "Serialization Duration": 0.004 secs, "Total Duration": 2.264 secs }

最近一次API成功的时间轴

[Timeline]: Timeline: { "Request Start Time": 493671593.859, "Initial Response Time": 493671621.500, "Request Completed Time": 493671621.513, "Serialization Completed Time": 493671621.519, "Latency": 60.140 secs, "Request Duration": 60.140 secs, "Serialization Duration": 0.007 secs, "Total Duration": 60.147 secs }

但是如果我同步执行它,就不会出现这种超时情况。API被调用了1000次,没有出现失败的情况。

我不明白为什么当我多次异步击中API时延迟会以这种方式增加。我知道这个错误可以通过增加超时时间来避免。但是我想首先知道它发生的原因。

网络堆栈将只允许一定数量的请求同时执行,并且将阻止新请求的发布,直到一些请求完成。因此,您的1000个请求正在尽快启动,但后面的请求需要等待前面的请求完成才能真正连接,因此时间不断增加。

看这个线程的一些细节如何处理这种情况:

最新更新