многопоточный грабер.

 
0
 
Perl
ava
burakov | 09.04.2013, 15:27
Добрый день.

есть многопоточный скрипт. грабер (LWP)
основаннный на реальных потоках

use threads;
use threads::shared;
use Thread::Queue;

который иногда умирает

как можно отследить -  почему?
везде понатыкал die (print );

но умирает поток. а все остальное несется. (в консоли дальше), ошибок не видно.
нужно чтобы если сработало какое то die, то останавливалось бы все приложение. (весь скрипт).
как это сделать?

пытался die (print ; exit;) -- не вышло.

что можно сделать?
спасибо.
Comments (8)
ava
infarch | 10.04.2013, 10:17 #
Самое простое - запускать все опасное в eval, ловить ошибку и выставлять глобальный флаг остановки. Разумеется он должен периодически проверяться во всех потоках.
ava
burakov | 10.04.2013, 10:26 #
про "глобальный флаг остановки" -- понял
про "проверять во всех потоках" -- понял

>>пускать все опасное в eval,
Это более менее понятно


>>ловить ошибку
может пример какой есть?


и еще вопросик.
очевидно что проблемы мои начались, когда объем скриптов и их сложность стала более 1500 строк кода.
вероятно нужно прекращать писать "на коленке". хотя вроде все в классах, более менее я упорядочиваю. но все же. видно что то не так.

подскажите русско язычные книги про то как это все грамотно писать

работа с конфиг файлом // наверняка есть какие то готовые интересные решения, более грамотные, чем написал я сам

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

то есть интересует какой то хелп., конкретный с примерами.



спасибо.
ava
infarch | 10.04.2013, 12:21 #
Цитата (burakov @  10.4.2013,  10:26 findReferencedText)
>>ловить ошибку

может пример какой есть?

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

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

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

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

ava
DurRandir | 10.04.2013, 14:56 #
Ну раз потоки, то хоть kill KILL => $$, хуже уже не сделает)
ava
infarch | 10.04.2013, 15:16 #
Цитата (DurRandir @  10.4.2013,  14:56 findReferencedText)
Ну раз потоки, то хоть kill KILL => $$, хуже уже не сделает) 

А может и сделает. Программисту виднее когда можно завершить работу потока без ущерба для системы. Так что флаг в расшаренной переменной - самое то.
ava
DurRandir | 10.04.2013, 17:42 #
Из блокирующего вызова он выйти всё равно не сможет, если там всё подвисло (вдруг). 
ava
Loki | 21.07.2013, 06:58 #
Теперь у вас все работает?
Мне когда-то на perlmonks сказали что лучше вообще не использовать потоки в perl 5, форки еще куда не шло.
ava
burakov | 21.07.2013, 10:17 #
не знаю как оно с потоками в принципе .. ибо однобоко их использую..
для грабера своего. но в нем они работают кроссплатформенно и очень устойчиво. несмотря на мой кривой код.
грабер может пахать неделю и более и все завершится . как нужно без ошибок.

по поводу отлова ошибок.
делаю exit;
в том месте, где ошибка предполагается. ну и принт. переменной, флага. или чего нибудь.
Таким образом скрипт останавливается, а я пытаюсь разобраться что там к чему.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit