| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > многопоточный грабер. |
| Автор: burakov 9.4.2013, 14:27 |
| Добрый день. есть многопоточный скрипт. грабер (LWP) основаннный на реальных потоках use threads; use threads::shared; use Thread::Queue; который иногда умирает как можно отследить - почему? везде понатыкал die (print ); но умирает поток. а все остальное несется. (в консоли дальше), ошибок не видно. нужно чтобы если сработало какое то die, то останавливалось бы все приложение. (весь скрипт). как это сделать? пытался die (print ; exit;) -- не вышло. что можно сделать? спасибо. |
| Автор: infarch 10.4.2013, 10:17 |
| Самое простое - запускать все опасное в eval, ловить ошибку и выставлять глобальный флаг остановки. Разумеется он должен периодически проверяться во всех потоках. |
| Автор: burakov 10.4.2013, 10:26 |
| про "глобальный флаг остановки" -- понял про "проверять во всех потоках" -- понял >>пускать все опасное в eval, Это более менее понятно >>ловить ошибку может пример какой есть? и еще вопросик. очевидно что проблемы мои начались, когда объем скриптов и их сложность стала более 1500 строк кода. вероятно нужно прекращать писать "на коленке". хотя вроде все в классах, более менее я упорядочиваю. но все же. видно что то не так. подскажите русско язычные книги про то как это все грамотно писать работа с конфиг файлом // наверняка есть какие то готовые интересные решения, более грамотные, чем написал я сам как правильно разбивать на части приложение (скрипт). как это связывать между собой. опять же работа с исключениями (ошибками) то есть интересует какой то хелп., конкретный с примерами. спасибо. |
| Автор: infarch 10.4.2013, 12:21 | ||
Есть конечно. Вот тут: http://perldoc.perl.org/functions/eval.html.
Это вам надо уже общие концепции программирования учить, без связи с Перл. Паттерны, ООП и т.д. |
| Автор: DurRandir 10.4.2013, 14:56 |
| Ну раз потоки, то хоть kill KILL => $$, хуже уже не сделает) |
| Автор: infarch 10.4.2013, 15:16 |
А может и сделает. Программисту виднее когда можно завершить работу потока без ущерба для системы. Так что флаг в расшаренной переменной - самое то. |
| Автор: DurRandir 10.4.2013, 17:42 |
| Из блокирующего вызова он выйти всё равно не сможет, если там всё подвисло (вдруг). |
| Автор: Loki 21.7.2013, 06:58 |
| Теперь у вас все работает? Мне когда-то на perlmonks сказали что лучше вообще не использовать потоки в perl 5, форки еще куда не шло. |
| Автор: burakov 21.7.2013, 10:17 |
| не знаю как оно с потоками в принципе .. ибо однобоко их использую.. для грабера своего. но в нем они работают кроссплатформенно и очень устойчиво. несмотря на мой кривой код. грабер может пахать неделю и более и все завершится . как нужно без ошибок. по поводу отлова ошибок. делаю exit; в том месте, где ошибка предполагается. ну и принт. переменной, флага. или чего нибудь. Таким образом скрипт останавливается, а я пытаюсь разобраться что там к чему. |