Как лучше всего обрабатывать ошибки в параллельных программах?

11

Когда в дверь стучат параллельные алгоритмы, самое время подумать об обработке ошибок.

Так что сначала были коды ошибок. Те сосали Их можно было свободно игнорировать, так что вы могли допустить ошибку и создать трудный для отладки код.

Затем пришли исключения. Их было невозможно игнорировать, когда они происходят, и большинству людей (кроме Джоэла) они нравятся больше.

И теперь у нас есть библиотеки, которые помогают параллельному коду. Проблема в том, что вы не можете обрабатывать исключения в параллельном коде так же легко, как в непараллельном коде. Если вы запускаете задачу асинхронно, и она выдает исключение, за ней не остается трассировки стека, чтобы ее можно было развернуть; лучшее, что вы можете сделать, это захватить и зарегистрировать его на объекте задачи, если такой объект существует. Тем не менее, он побеждает основную силу исключений: вы должны проверять их, и вы можете игнорировать их без каких-либо дополнительных усилий , тогда как в однопоточном коде исключение обязательно вызовет соответствующие действия (даже если это означает завершение вашей программы).

Как языковые реализации или библиотеки должны поддерживать ошибки в параллельном коде?

zneak
источник
2
Разве это не должно принадлежать stackoverflow ?
Гравитон
@Ngu Скоро Хуэй Это субъективно и о функциях, которые не обязательно существуют, поэтому я думаю, что это относится к этому.
zneak
Но это касается программирования, а не программистов. :)
bzlm
1
В @bzlm FAQ говорится: «Программисты - Stack Exchange для опытных программистов, которые заинтересованы в субъективных дискуссиях по разработке программного обеспечения». и ТАК явно препятствует субъективным обсуждениям.
zneak

Ответы:

2

Я довольно люблю обратные вызовы для ошибок, которые могут быть обработаны. И их можно заставить работать нормально асинхронно ...

Но для ошибок, которые не могут быть обработаны, действительно исключительных ошибок, я бы предпочел, чтобы соответствующая информация была сохранена, и программа была закрыта. Так как это обычно выполняется через какой-то глобальный обработчик ошибок, я не вижу необходимости превращать исключения во что-то, что работает для этого - но лучше было бы поддерживать платформу для обнаружения критических ошибок, создания дампов памяти и т. Д.

Shog9
источник
Я второй колбэки. Идея, представленная выше, кажется мне совершенно идеальной.
Pax Noctis
-2

Похоже, вы хотели бы убедиться, что задача обрабатывает свои собственные исключения, а затем вернуть что-то, что сообщит вызывающей программе, что поток необходимо закрыть. Тогда он будет иметь логику для обработки результатов всех потоков, зная, что некоторые из этих потоков потерпели неудачу.


источник
5
«возвращать что-то» - кому? Звонящий уже перешел.
Марк Х
Как сказал @sparkie, ты не можешь просто сделать это. Даже если вы сохраните стек вызовов в качестве корня для сопрограммы, вызывающая сторона, вероятно, будет далеко-далеко. Как я уже говорил, исключения были разработаны таким образом они останавливают вашу программу , в настоящее время . Самостоятельная проверка позже побеждает его полностью, поскольку исключения могут пройти незамеченными.
zneak
@Zneak, я полагаю, когда я упомянул исключения, я не использовал ваше (стандартное) определение, я просто имел в виду, что ошибка была обнаружена. После того, как любая функция завершена, она должна вернуться куда-то, и в этот момент можно устранить «исключение» / ошибку (на этом уровне). Я не уверен, почему вы, ребята, имеете в виду, что вызывающая программа находится далеко, любое возвращаемое значение из функции должно быть каким-то образом обработано. Я понимаю, что это не будет работать почти так же хорошо, если результаты потоков будут зависеть друг от друга.
1
Не все параллельные задачи «возвращаются» куда-то. Например, вы можете просто делегировать длинную задачу отдельному потоку, одновременно делая что-то еще в главном потоке (ошибочно), даже не задумываясь, правильно ли она выполнена. Например, я мог бы написать программное обеспечение для редактирования изображений, которое пишет в файлы из вторичного потока, и вернуться из диалогового окна сохранения, как только задача будет запущена. Мне не понадобится возвращаемое значение, каким бы оно ни было, для любых дальнейших операций, поэтому, за исключением ошибок, нет причин проверять его.
zneak