Структурированная параллельная обработка Java 21, требуется предсказуемый порядок исключений подзадач ⇐ JAVA
Структурированная параллельная обработка Java 21, требуется предсказуемый порядок исключений подзадач
Я новичок в параллельном коде и пытался преобразовать некоторый код, основанный на исполнителях, в структурированный параллелизм, но я потерял важное свойство, которое мне нужно каким-то образом сохранить.
При использовании следующего кода, использующего структурированный параллелизм с предварительной версией Java 21:
try (varscope = new StructuredTaskScope.ShutdownOnFailure()) { Подзадача d1Subtask =scope.fork(() -> getData1(input)); Подзадача d2Subtask =scope.fork(() -> getData2(input)); область видимости.join().throwIfFailed(); // [1] вар данные1 = d1Subtask.get(); // [2] вар data2 = d2Subtask.get(); вернуть новый ответ (данные1, данные2); } В [1] выдается первое исключение из двух подзадач, а я этого не хочу. Мне нужно запустить обе задачи параллельно, но сначала мне нужен результат d1Subtask на случай сбоя. Другими словами, если обе подзадачи завершаются с ошибкой Data1Exception и Data2Exception соответственно, я должен выдать Data1Exception независимо от того, какая из них завершилась первой.
Если я изменю его на scope.join();, то [2] может завершиться ошибкой, если d1Subtask не выполнен. Существует d1Subtask.state(), но ожидание выхода из состояния State.UNAVAILABLE противоречит идее структурированного параллелизма.
Учитывая это, можно ли изменить приведенный выше код, чтобы он ждал результата d1Subtask? Я подумал, что что-то вроде scope.join(d1Subtask) или d1Subtask.join() будет полезной функцией. Является ли это пробелом в предоставленном API или есть способ добиться того, чего я хочу, с помощью чистого, читаемого кода?
Я новичок в параллельном коде и пытался преобразовать некоторый код, основанный на исполнителях, в структурированный параллелизм, но я потерял важное свойство, которое мне нужно каким-то образом сохранить.
При использовании следующего кода, использующего структурированный параллелизм с предварительной версией Java 21:
try (varscope = new StructuredTaskScope.ShutdownOnFailure()) { Подзадача d1Subtask =scope.fork(() -> getData1(input)); Подзадача d2Subtask =scope.fork(() -> getData2(input)); область видимости.join().throwIfFailed(); // [1] вар данные1 = d1Subtask.get(); // [2] вар data2 = d2Subtask.get(); вернуть новый ответ (данные1, данные2); } В [1] выдается первое исключение из двух подзадач, а я этого не хочу. Мне нужно запустить обе задачи параллельно, но сначала мне нужен результат d1Subtask на случай сбоя. Другими словами, если обе подзадачи завершаются с ошибкой Data1Exception и Data2Exception соответственно, я должен выдать Data1Exception независимо от того, какая из них завершилась первой.
Если я изменю его на scope.join();, то [2] может завершиться ошибкой, если d1Subtask не выполнен. Существует d1Subtask.state(), но ожидание выхода из состояния State.UNAVAILABLE противоречит идее структурированного параллелизма.
Учитывая это, можно ли изменить приведенный выше код, чтобы он ждал результата d1Subtask? Я подумал, что что-то вроде scope.join(d1Subtask) или d1Subtask.join() будет полезной функцией. Является ли это пробелом в предоставленном API или есть способ добиться того, чего я хочу, с помощью чистого, читаемого кода?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Структурированный параллелизм Java 21 требует предсказуемого порядка исключений подзадач
Anonymous » » в форуме JAVA - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Структурированный параллелизм Java 21 требует предсказуемого порядка исключений подзадач
Anonymous » » в форуме JAVA - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-