如何并行而不是顺序执行多个模型?
How to execute multiple models in parallel instead of sequentially?
我有各种模型,我正在按顺序一个接一个地执行这些模型。我将有大约 200 个模型。
下面是我的代码,我在其中一个一个地执行这些模型
Map<String, List<ServerMetrics>> metricsHolder = new HashMap<String, List<ServerMetrics>>();
for (String alias : serverNames) {
List<ClientsModel> modelMetadata = getModelAttributes();
List<MachineInfo> machineInfo = getMachineInfo();
List<ServerMetrics> metricsList = new ArrayList<ServerMetrics>();
// calling model one by one sequentially
// is there any way to make this multithreaded?
// here modelMetadata size might be 100 or 200
for (ClientsModel modelList : modelMetadata) {
String modelValue = modelList.getModelValue();
String modelId = String.valueOf(modelList.getModelId());
// execute my model here and storing the metrics in the metricsList object
ServerMetrics metrics = TestUtils.executeModelMetrics(machineInfo, modelValue);
metrics.setModelId(modelId);
metricsList.add(metrics);
}
metricsHolder.put(alias, dynMetricsList);
}
问题陈述:-
有什么方法可以使模型执行多线程,然后将结果存储到 metricsList
对象中?
如果您的代码中没有数据竞争条件(多线程访问未正确同步的相同数据),那么您可以使用 ExecutorService
形式的线程池来运行 Callable
线程实现。您可以在 Callable
.
中完成工作
在主线程上,ExecutorService
returns 一个 Future
然后您可以等待所有任务都已生成。
线程池的大小(此处设置为 10
,但您可以更改它)决定了并行的数量 运行。您仍然可以执行比线程池大小更多的 Callable
s。
Map<String, List<ServerMetrics>> metricsHolder = new HashMap<String, List<ServerMetrics>>();
// Size of thread pool set at 10 - can be increased but increasing it
// to more than the number of cores on your computer is probably not
// useful, as it seems like your task is CPU-bound
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (String alias : serverNames) {
List<ClientsModel> modelMetadata = getModelAttributes();
List<MachineInfo> machineInfo = getMachineInfo();
List<Future<ServerMetrics>> metricsFutureList = new ArrayList<Future<ServerMetrics>>();
// calling model one by one sequentially
// is there any way to make this multithreaded?
for (ClientsModel modelList : modelMetadata) {
final String modelValue = modelList.getModelValue();
final String modelId = String.valueOf(modelList.getModelId());
metricsFutureList.add(executorService.submit(new Callable<ServerMetrics>() {
@Override
public ServerMetrics call() throws Exception {
// execute my model here and storing the metrics in the list
ServerMetrics metrics = TestUtils.executeModelMetrics(machineInfo, modelValue);
metrics.setModelId(modelId);
return metrics;
}
}));
}
List<ServerMetrics> metricsList = new ArrayList<ServerMetrics>();
for (Future<ServerMetrics> future : metricsFutureList) {
metricsList.add(future.get());
}
metricsHolder.put(alias, dynMetricsList);
}
我有各种模型,我正在按顺序一个接一个地执行这些模型。我将有大约 200 个模型。
下面是我的代码,我在其中一个一个地执行这些模型
Map<String, List<ServerMetrics>> metricsHolder = new HashMap<String, List<ServerMetrics>>();
for (String alias : serverNames) {
List<ClientsModel> modelMetadata = getModelAttributes();
List<MachineInfo> machineInfo = getMachineInfo();
List<ServerMetrics> metricsList = new ArrayList<ServerMetrics>();
// calling model one by one sequentially
// is there any way to make this multithreaded?
// here modelMetadata size might be 100 or 200
for (ClientsModel modelList : modelMetadata) {
String modelValue = modelList.getModelValue();
String modelId = String.valueOf(modelList.getModelId());
// execute my model here and storing the metrics in the metricsList object
ServerMetrics metrics = TestUtils.executeModelMetrics(machineInfo, modelValue);
metrics.setModelId(modelId);
metricsList.add(metrics);
}
metricsHolder.put(alias, dynMetricsList);
}
问题陈述:-
有什么方法可以使模型执行多线程,然后将结果存储到 metricsList
对象中?
如果您的代码中没有数据竞争条件(多线程访问未正确同步的相同数据),那么您可以使用 ExecutorService
形式的线程池来运行 Callable
线程实现。您可以在 Callable
.
在主线程上,ExecutorService
returns 一个 Future
然后您可以等待所有任务都已生成。
线程池的大小(此处设置为 10
,但您可以更改它)决定了并行的数量 运行。您仍然可以执行比线程池大小更多的 Callable
s。
Map<String, List<ServerMetrics>> metricsHolder = new HashMap<String, List<ServerMetrics>>();
// Size of thread pool set at 10 - can be increased but increasing it
// to more than the number of cores on your computer is probably not
// useful, as it seems like your task is CPU-bound
ExecutorService executorService = Executors.newFixedThreadPool(10);
for (String alias : serverNames) {
List<ClientsModel> modelMetadata = getModelAttributes();
List<MachineInfo> machineInfo = getMachineInfo();
List<Future<ServerMetrics>> metricsFutureList = new ArrayList<Future<ServerMetrics>>();
// calling model one by one sequentially
// is there any way to make this multithreaded?
for (ClientsModel modelList : modelMetadata) {
final String modelValue = modelList.getModelValue();
final String modelId = String.valueOf(modelList.getModelId());
metricsFutureList.add(executorService.submit(new Callable<ServerMetrics>() {
@Override
public ServerMetrics call() throws Exception {
// execute my model here and storing the metrics in the list
ServerMetrics metrics = TestUtils.executeModelMetrics(machineInfo, modelValue);
metrics.setModelId(modelId);
return metrics;
}
}));
}
List<ServerMetrics> metricsList = new ArrayList<ServerMetrics>();
for (Future<ServerMetrics> future : metricsFutureList) {
metricsList.add(future.get());
}
metricsHolder.put(alias, dynMetricsList);
}