使用OkHttp3时遇到问题。
基本上我的项目创建了大约50个线程。这些线程共享以下客户端:
private final OkHttpClient CLIENT = new OkHttpClient().newBuilder()
.readTimeout(10000, TimeUnit.MILLISECONDS)
.connectTimeout(10000, TimeUnit.MILLISECONDS)
.writeTimeout(10000, TimeUnit.MILLISECONDS)
.followRedirects(false)
.followSslRedirects(false)
.build();
每当线程尝试通过HTTP下载网页时,它都会执行以下代码:
Request request = new Request.Builder()
.url(someURLString)
.build();
Call call = CLIENT.newCall(request);
try (okhttp3.Response okHTTPResponse = call.execute()) {
// handling the downloaded page here
}
我的问题是,当我将线程增加到100个线程甚至200个线程时,整体速度保持不变。但是,当我运行我的项目2次甚至4次时,我的整体速度提高了x2或x4倍。
以整体速度表示每秒下载网页的平均数量。
正如OkHttp3文档所述,execute
对HTTP连接的数量没有限制,但不知何故看起来我的代码仍然受到某种我不知道的限制的限制。 / p>
还有一件事,当我创建200个线程时,我创建了一个简单的日志记录,其中一个线程在它开始并完成下载网页时打印一条日志消息,我注意到只有带有ids<的线程。 30实际上是打印日志消息,这意味着其他线程实际上并没有执行任何任务。
另外,根据上面提到的日志,我设法计算处理一个页面所需的平均时间,每个网页大约0.5秒。
我在36核的服务器上运行我的程序,互联网速度为1 Gb,因此CPU速度和互联网应该不是问题。
任何人都可以帮我解决这个问题或者在我的方法中指出问题吗?