gpt4 book ai didi

java - java中的并行流

转载 作者:行者123 更新时间:2023-12-01 11:07:31 25 4
gpt4 key购买 nike

我正在尝试使用并行流来调用 API 端点以取回一些数据。我正在使用 ArrayList<String>并将每个字符串发送到一个方法,该方法使用它来调用我的 API。我已经设置了并行流来调用一个方法,该方法将调用端点并编码返回的数据。对我来说,问题是,当在 htop 中查看此内容时,我看到数据库服务器上的所有核心在我点击此方法的第二个时间点都亮起……然后当第一组完成时,我看到 1 或 2 个核心亮起。我的问题是,我认为我确实得到了我想要的结果......仅针对第一组调用,然后从监控来看,其余的调用一次只进行一个。

我认为这可能与递归有关,但我不是 100% 确定。

private void generateObjectMap(Integer count){
ArrayList<String> myList = getMyList();
myList.parallelStream().forEach(f -> performApiRequest(f,count));
}

private void performApiRequest(String myString,Integer count){
if(count < 10) {
TreeMap<Integer,TreeMap<Date,MyObj>> tempMap = new TreeMap();
try {
tempMap = myJson.getTempMap(myRestClient.executeGet(myString);
} catch(SocketTimeoutException e) {
count += 1;
performApiRequest(myString,count);
}
...
else {
System.exit(1);
}
}

最佳答案

这对于并行流来说似乎是一种不寻常的用法。一般来说,您的想法是通知 JVM 流上的操作是真正独立的,并且可以在一个或多个线程中以任何顺序运行。结果将随后被减少或收集为流的一部分。这里要记住的重要一点是,副作用是未定义的(这就是为什么流中更改的变量需要是最终的或有效最终的),并且您不应该依赖 JVM 如何组织操作的执行。

我可以想象以下是合理的用法:

list.parallelStream().map(item -> getDataUsingApi(item))
.collect(Collectors.toList());

API 返回数据,然后将其传递给下游操作,不会产生任何副作用。

总之,如果您想严格控制 api 调用的执行方式,我建议您不要为此使用并行流。传统的 Thread 实例(可能带有 ThreadPoolExecutor )将为您提供更好的服务。

关于java - java中的并行流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com