我有一个response.php,它为每个带有不同标头数据的 HTTP POST 返回一个 JSON 数据。一次生成大约 30 个请求并处理其响应数据的最有效方法是什么?这需要非常有效,因为硬件的性能相当有限。
问问题
766 次
2 回答
3
不清楚您所说的“一次生成大约 30 个请求并处理它们的响应数据”是什么意思。
但最有效地利用>>YOUR<<
时间(以及我们的时间)将以直接的方式实现这一点,然后看看性能是否足够好。当简单的解决方案足够好时,花很多额外的时间编写一个超高效的解决方案是没有意义的。
简单的解决方案是创建 30 个客户端线程,并让每个线程使用 HttpUrlConnection 发送一个 POST 请求。这是否“有效”取决于瓶颈是什么资源。(当然,这同样适用于如何使其更“高效”的想法。)说硬件“性能相当有限”并不能真正给我们提供太多线索......
一旦你有了一个简单的解决方案,并且你已经确定了实际的瓶颈区域是什么(客户端 CPU?线程堆栈?网络速度?)......我们可以就如何使你的代码更快地提出有意义的建议。但是通过要求“最有效”的解决方案,您只是在鼓励人们猜测瓶颈是什么。
最后一点。当您说“最有效”时,有两种解释方式。您可能的意思是,一种在最短的时间内发送请求并处理响应的解决方案。或者,您可能指的是在客户端和/或服务器上放置最少资源消耗(CPU 和/或内存和/或网络带宽)的解决方案。这不仅仅是一个狡辩。不同风格的“高效”需要明显不同的解决方案。
于 2013-05-05T00:48:30.997 回答
-1
改用这些高级 API,代码更简洁,更易于使用。
public static void main(String args[]) {
int THREAD_COUNT = 30;
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_COUNT);
//Add the enw jobs where we just insert
List<Callable<Void>> jobs = new ArrayList<Callable<Void>>();
for (int i = 0; i < THREAD_COUNT; i++) {
jobs.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
URL url = new URL("http://yourserver.com/respond.php");
URLConnection conn = url.openConnection();
conn.setDoInput(true);
// Here is where you would use a JSON parser library to parse from the conn.getInputStream method.
// Don't forget to close the input stream.
// And then you can handle and do stuff here.
return null; //aren't interested in the returned value
}
});
}
executorService.invokeAll(jobs);
}
于 2013-05-05T00:18:42.070 回答