Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(burakov @  10.4.2013,  10:26 Найти цитируемый пост)
>>ловить ошибку
может пример какой есть?

Есть конечно. Вот тут: http://perldoc.perl.org/functions/eval.html.
Код

eval { $answer = $a / $b; }; warn $@ if $@;

Цитата(burakov @  10.4.2013,  10:26 Найти цитируемый пост)
то есть интересует какой то хелп., конкретный с примерами

Это вам надо уже общие концепции программирования учить, без связи с Перл. Паттерны, ООП и т.д.


Автор: DurRandir 10.4.2013, 14:56
Ну раз потоки, то хоть kill KILL => $$, хуже уже не сделает)

Автор: infarch 10.4.2013, 15:16
Цитата(DurRandir @  10.4.2013,  14:56 Найти цитируемый пост)
Ну раз потоки, то хоть kill KILL => $$, хуже уже не сделает) 

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

Автор: DurRandir 10.4.2013, 17:42
Из блокирующего вызова он выйти всё равно не сможет, если там всё подвисло (вдруг). 

Автор: Loki 21.7.2013, 06:58
Теперь у вас все работает?
Мне когда-то на perlmonks сказали что лучше вообще не использовать потоки в perl 5, форки еще куда не шло.

Автор: burakov 21.7.2013, 10:17
не знаю как оно с потоками в принципе .. ибо однобоко их использую..
для грабера своего. но в нем они работают кроссплатформенно и очень устойчиво. несмотря на мой кривой код.
грабер может пахать неделю и более и все завершится . как нужно без ошибок.

по поводу отлова ошибок.
делаю exit;
в том месте, где ошибка предполагается. ну и принт. переменной, флага. или чего нибудь.
Таким образом скрипт останавливается, а я пытаюсь разобраться что там к чему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)