OkHttp 如何在不使用线程的情况下,使用看似同步的 HTTP 连接执行并行 HTTP 请求?
我已经使用OkHttp库进行了一些性能测试,发现它很棒。它在我的HTC One手机上以4.7秒的速度完成了80个请求,http://httpbin.org/delay/1,每个请求故意暂停1秒。我已经看过代码,我试图找出为什么它这么快。开发人员(Square Inc)宣传连接池和异步调用,我相信这两者都有助于良好的性能。
我来自.NET世界,在.NET 4.5中,你有一个真正的异步HTTP库,带有异步GetResponse方法。通过在等待响应时将线程提供给操作系统,您可以释放资源以启动更多HTTP请求或其他东西。问题是我无法看到与OkHttp(或我研究过的任何其他Android HTTP库)相同的模式。那么,我怎样才能在4秒内执行80个1秒的请求呢?它不是基于线程的,对吧?我没有启动 80 个(或 20 个)线程?
具体来说,在 com.squareup.okhttp.Call.beginRequest() 中,我没有看到 和 调用之间的线程产生:sendRequest
getResponse
if (canceled) return null;
try {
engine.sendRequest();
if (request.body() != null) {
BufferedSink sink = engine.getBufferedRequestBody();
request.body().writeTo(sink);
}
engine.readResponse();
} catch (IOException e) {
HttpEngine retryEngine = engine.recover(e, null);
if (retryEngine != null) {
engine = retryEngine;
continue;
}
// Give up; recovery is not possible.
throw e;
}
Response response = engine.getResponse();
那么,如何使80个“并行”调用成为可能呢?
我不需要知道这个来使用库,但是异步编程让我感兴趣,我真的很想了解OkHttp / SquareInc是如何解决这个问题的。