Python 代码 - 使用多处理池并映射字符串数组。在数组中的每个项目上,使用分部函数调用callback_function:
p = multiprocessing.Pool(1)
p.map(functools.partial(callback_function,
arg1 = arg1,
arg2 = arg2,
), array_string_items)
我正在尝试在Java中做类似的事情。我在Java API中没有看到任何像上面的Python代码那样简单的内容。
1) 是否更鼓励使用线程而不是处理器池? 2)如果是这样,我将如何实施?
谢谢
你的Python示例在Java中看起来像这样:
stringList.parallelStream()
.map((str) -> callbackFunction.apply(arg1, arg2, str));
假设callbackFunction
接受三个参数,并且你应用常量 arg1,arg2 参数使其部分化。
您可以显式定义分部函数:
int arg1 = 10;
String arg2 = "foo";
Function<String, String> partialFunction = (str) -> callbackFunction.apply(arg1, arg2, str);
然后流处理变得非常简单:
stringList.parallelStream().map(partialFunction);
Java8 流看起来几乎像你的示例:
Integer ageSum = persons
.parallelStream()
.reduce(0,
(sum, p) -> {
System.out.format("accumulator: sum=%s; person=%sn", sum, p);
return sum += p.age;
},
(sum1, sum2) -> {
System.out.format("combiner: sum1=%s; sum2=%sn", sum1, sum2);
return sum1 + sum2;
});
至于自定义可运行对象/可调用对象,解决方案对我来说似乎也像在 Python 中一样简单:
List<Callable<Void>> opsList = new ArrayList<>();
opsList.add(someCallable);
// create list of tasks you need to run in parallel...
ExecutorService execSvc = Executors.newFixedThreadPool(4); // 4 threads. check out newCachedThreadPool too
try {
execSvc.invokeAll(opsList);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
execSvc.shutdown();
}