Що було б найкращим способом обробляти помилки в паралельних програмах?


11

Якщо паралельні алгоритми стукають у двері, можливо, вдалий час подумати про обробку помилок.

Тож спочатку були коди помилок. Ті смоктали. Можна було їх ігнорувати, тож ви могли пізно вийти з ладу та створити важкий для налагодження код.

Потім прийшли винятки. Після їх виникнення було неможливо ігнорувати, і більшість людей (крім Джоеля) їм подобаються більше.

І ось ми отримали бібліотеки, які допомагають паралельному коду. Проблема полягає в тому, що ви не можете обробляти винятки з паралельного коду так легко, як ви могли з непаралельним кодом. Якщо ви асинхронно запускаєте завдання, і воно викидає виняток, немає жодного сліду стека, який він прокручує; Найкраще, що ви можете зробити - це захопити його та зареєструвати на об’єкті завдання, якщо такий об’єкт є. Однак він перемагає первинну силу винятків: ви повинні перевірити їх, і ви можете ігнорувати їх без додаткових зусиль , тоді як в однопотоковому коді виняток обов’язково запустить відповідні дії (навіть якщо це означає припинення вашої програми).

Як мовні реалізації або бібліотеки повинні підтримувати помилки в паралельному коді?


2
Чи не повинно це належати до stackoverflow ?
Гравітон

@Ngu Скоро Хуй Це суб'єктивно, і це стосується особливостей, які не обов'язково існують, тому я думаю, що це тут належить.
zneak

Але мова йде про програмування, а не про програмістів. :)
bzlm

1
@bzlm FAQ говорить: "Програмісти - обмін стеками - це для експертів-програмістів, які зацікавлені в суб'єктивних дискусіях щодо розробки програмного забезпечення". і ТАК явно відлякує суб'єктивні дискусії.
zneak

Відповіді:


2

Мені більше подобаються зворотні виклики за помилки, з якими можна впоратися. І їх можна змусити працювати просто чудово асинхронно ...

Але для помилок, з якими не вдається впоратися, справді виняткових помилок, я вважаю, що відповідна інформація зберігається, а програма припиняється. Оскільки це, як правило, здійснюється через якийсь глобальний обробник помилок, так чи інакше, я не бачу необхідності перекручувати винятки в щось, що для цього працює - але краща підтримка платформи для виявлення критичних помилок та створення пам’яті пам’яті тощо було б непогано.


Я другий зворотній зв'язок. Ідея вище мені здається досить досконалою.
Pax Noctis

-2

Схоже, ви хочете переконатися, що завдання обробляється власними винятками, а потім повернути щось, що дасть програмі, що викликає, знати, що нитку потрібно закрити. Тоді було б логікою обробити результат усіх потоків, знаючи, що деякі з цих потоків вийшли з ладу.


5
"повернути щось" - кому? Абонент вже перейшов.
Позначте H

Як сказав @sparkie, ви не можете просто так зробити. Навіть якщо ви будете зберігати стек виклику як корінь для програми, то абонент, ймовірно, буде далеко, далеко. Як я вже говорив, виключення були розроблені таким чином вони зупиняють вашу програму , в даний час . Пізніше перевіряючи це, виграєте його повністю, оскільки винятки можуть пройти непомітно.
zneak

@Zneak, я думаю, коли я згадував про винятки, я не використовував ваше (стандартне) визначення, я просто мав на увазі помилку. Після того, як будь-яка функція буде завершена, вона повинна повернутися кудись, і в цей момент "виняток" / помилка може бути вирішена (на цьому рівні). Я не впевнений, чому ви, хлопці, посилаєтесь на те, що програма виклику знаходиться далеко, будь-яке повернене значення функції потрібно якось вирішувати. Я усвідомлюю, що це не спрацює майже так добре, якщо результати ниток взаємопов'язані між собою.

1
Не всі паралельні завдання десь «повертаються». Наприклад, ви можете просто делегувати довге завдання в окремий потік, виконуючи щось інше на головній нитці (помилково), не замислюючись, чи правильно воно виконано. Наприклад, я можу написати програмне забезпечення для редагування зображень, яке записує у файли з другорядного потоку, і повернутися з діалогового вікна збереження, як тільки завдання розпочнеться. Я не потребуватиму поверненого значення, як би воно не було, для будь-якої подальшої операції, тому, крім помилок, немає підстав перевіряти це.
zneak
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.