1

我有一个response.php,它为每个带有不同标头数据的 HTTP POST 返回一个 JSON 数据。一次生成大约 30 个请求并处理其响应数据的最有效方法是什么?这需要非常有效,因为硬件的性能相当有限。

4

2 回答 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 回答