![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| FishHunter |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 12.2.2009 Репутация: нет Всего: нет |
Добрый день Уважаемые,
Это мой первый пост поэтому немного о себе. Решил я научиться кодить на перл, занимаюсь этим делом уже около 2 месяцев. Потихоньку дошел до потоков и застрял на такой проблеме. Вообщем есть скрипт, который в многопоточном режиме чекает ответы серверов по заданным урлам. Прошу не ругать за может быть корявость кода, но тем не менее ...
на мой нубский взгляд, работа с потоками описана без ошибок, но тем не менее скрипт не хочет пахать, вернее начинает, а потом вылетает с таким сообщением index 1329 thread 30 => 1234445195 Error url index 1301 thread 2 => 1234445194 Good url but they DO NOT know about jazz index 1320 thread 21 => 1234445194 Error url *** glibc detected *** perl: double free or corruption (fasttop): 0xb38047a0 *** index 1300 thread 1 => 1234445194 Error url index 1317 thread 18 => 1234445194 Error url ======= Backtrace: ========= /lib/libc.so.6[0x495fdd06] /lib/libc.so.6(cfree+0x90)[0x496011e0] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_newCONSTSUB+0x154)[0x4985d254] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IO/IO.so(boot_IO+0x3d2)[0xb74eb4d2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_pp_entersub+0x40d)[0x4989641d] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_runops_standard+0x1f)[0x4988f88f] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x4982fffe] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_sv+0x5e6)[0x49834806] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_list+0x20b)[0x49834b2b] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_newATTRSUB+0x1152)[0x49868382] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_utilize+0x331)[0x498665e1] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_yyparse+0x1b22)[0x498577c2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x498c3200] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_pp_require+0xd52)[0x498c50b2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_runops_standard+0x1f)[0x4988f88f] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x4982fffe] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_sv+0x5e6)[0x49834806] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_list+0x20b)[0x49834b2b] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_newATTRSUB+0x1152)[0x49868382] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_utilize+0x331)[0x498665e1] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_yyparse+0x1b22)[0x498577c2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x498c3200] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_pp_require+0xd52)[0x498c50b2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_runops_standard+0x1f)[0x4988f88f] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x4982fffe] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_sv+0x5e6)[0x49834806] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_list+0x20b)[0x49834b2b] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_newATTRSUB+0x1152)[0x49868382] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_utilize+0x331)[0x498665e1] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_yyparse+0x1b22)[0x498577c2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x498c3200] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_pp_require+0xd52)[0x498c50b2] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_runops_standard+0x1f)[0x4988f88f] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so[0x4982fffe] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so(Perl_call_sv+0x5e6)[0x49834806] /usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/threads/threads.so(Perl_ithread_run+0x1ae)[0xb7d28a5e] /lib/libpthread.so.0[0x4970e45b] /lib/libc.so.6(clone+0x5e)[0x49665e5e] ======= Memory map: ======== 08048000-0804b000 r-xp 00000000 08:01 3260944 /usr/bin/perl 0804b000-0804c000 rw-p 00002000 08:01 3260944 /usr/bin/perl 0804c000-0b278000 rw-p 0804c000 00:00 0 [heap] 49577000-49591000 r-xp 00000000 08:01 53739634 /lib/ld-2.5.so 49591000-49592000 r--p 00019000 08:01 53739634 /lib/ld-2.5.so 49592000-49593000 rw-p 0001a000 08:01 53739634 /lib/ld-2.5.so 49595000-496d2000 r-xp 00000000 08:01 53739638 /lib/libc-2.5.so 496d2000-496d4000 r--p 0013d000 08:01 53739638 /lib/libc-2.5.so 496d4000-496d5000 rw-p 0013f000 08:01 53739638 /lib/libc-2.5.so 496d5000-496d8000 rw-p 496d5000 00:00 0 496da000-496dc000 r-xp 00000000 08:01 53739659 /lib/libdl-2.5.so 496dc000-496dd000 r--p 00001000 08:01 53739659 /lib/libdl-2.5.so 496dd000-496de000 rw-p 00002000 08:01 53739659 /lib/libdl-2.5.so 496e0000-49705000 r-xp 00000000 08:01 53739644 /lib/libm-2.5.so 49705000-49706000 r--p 00024000 08:01 53739644 /lib/libm-2.5.so 49706000-49707000 rw-p 00025000 08:01 53739644 /lib/libm-2.5.so 49709000-4971c000 r-xp 00000000 08:01 53739682 /lib/libpthread-2.5.so 4971c000-4971d000 r--p 00012000 08:01 53739682 /lib/libpthread-2.5.so 4971d000-4971e000 rw-p 00013000 08:01 53739682 /lib/libpthread-2.5.so 4971e000-49720000 rw-p 4971e000 00:00 0 49722000-49738000 r-xp 00000000 08:01 53741227 /lib/libselinux.so.1 49738000-4973a000 rw-p 00015000 08:01 53741227 /lib/libselinux.so.1 4973c000-49777000 r-xp 00000000 08:01 53741220 /lib/libsepol.so.1 49777000-49778000 rw-p 0003a000 08:01 53741220 /lib/libsepol.so.1 49778000-49782000 rw-p 49778000 00:00 0 49794000-49796000 r-xp 00000000 08:01 53739737 /lib/libutil-2.5.so 49796000-49797000 r--p 00001000 08:01 53739737 /lib/libutil-2.5.so 49797000-49798000 rw-p 00002000 08:01 53739737 /lib/libutil-2.5.so 497a4000-497ad000 r-xp 00000000 08:01 53739650 /lib/libcrypt-2.5.so 497ad000-497ae000 r--p 00008000 08:01 53739650 /lib/libcrypt-2.5.so 497ae000-497af000 rw-p 00009000 08:01 53739650 /lib/libcrypt-2.5.so 497af000-497d6000 rw-p 497af000 00:00 0 497d8000-497eb000 r-xp 00000000 08:01 53739729 /lib/libnsl-2.5.so 497eb000-497ec000 r--p 00012000 08:01 53739729 /lib/libnsl-2.5.so 497ec000-497ed000 rw-p 00013000 08:01 53739729 /lib/libnsl-2.5.so 497ed000-497ef000 rw-p 497ed000 00:00 0 497f1000-49800000 r-xp 00000000 08:01 53739731 /lib/libresolv-2.5.so 49800000-49801000 r--p 0000e000 08:01 53739731 /lib/libresolv-2.5.so 49801000-49802000 rw-p 0000f000 08:01 53739731 /lib/libresolv-2.5.so 49802000-49804000 rw-p 49802000 00:00 0 4980e000-49939000 r-xp 00000000 08:01 3279280 /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so 49939000-4993e000 rw-p 0012a000 08:01 3279280 /usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE/libperl.so 4993e000-49940000 rw-p 4993e000 00:00 0 4999b000-499c8000 r-xp 00000000 08:01 3279415 /usr/lib/libgssapi_krb5.so.2.2 499c8000-499c9000 rw-p 0002d000 08:01 3279415 /usr/lib/libgssapi_krb5.so.2.2 499cb000-499d3000 r-xp 00000000 08:01 3279288 /usr/lib/libkrb5support.so.0.1 499d3000-499d4000 rw-p 00007000 08:01 3279288 /usr/lib/libkrb5support.so.0.1 499d6000-499fb000 r-xp 00000000 08:01 3279375 /usr/lib/libk5crypto.so.3.1 499fb000-499fc000 rw-p 00025000 08:01 3279375 /usr/lib/libk5crypto.so.3.1 499fe000-49a00000 r-xp 00000000 08:01 53741240 /lib/libkeyutils-1.2.so 49a00000-49a01000 rw-p 00001000 08:01 53741240 /lib/libkeyutils-1.2.so 49a03000-49b20000 r-xp 00000000 08:01 53741257 /lib/libcrypto.so.0.9.8b 49b20000-49b33000 rw-p 0011c000 08:01 53741257 /lib/libcrypto.so.0.9.8b 49b33000-49b36000 rw-p 49b33000 00:00 0 49b38000-49b79000 r-xp 00000000 08:01 53741268 /lib/libssl.so.0.9.8b 49b79000-49b7d000 rw-p 00040000 08:01 53741268 /lib/libssl.so.0.9.8b 83800000-838f8000 rw-p 83800000 00:00 0 838f8000-83900000 ---p 838f8000 00:00 0 83a00000-83a22000 rw-p 83a00000 00:00 0 83a22000-83b00000 ---p 83a22000 00:00 0 84400000-844db000 rw-p 84400000 00:00 0 844db000-84500000 ---p 844db000 00:00 0 ....... 93a00000-93b00000 rw-p 93a00000 00:00 0 93b00000-93c00000 rw-p 93b00000 Aborted [root@server myscripts]# вопрос: что сие значит и как это победить? или можно забить на потоки (читал неоднократно что в них полно глюков) и решать подобные задачи форками? (их ещё не учил PS забыл добавить, что с малым кол-вом данных все работает на ура, но если я в @urls загоню скажем 6к элементов то уже косяк :( Это сообщение отредактировал(а) FishHunter - 12.2.2009, 16:08 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
FishHunter, Вашу задачу можно решить при помощи событийной машины, посмотрите в сторону модуля EV. Если покажется непонятным, делайте через процессы.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| FishHunter |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 12.2.2009 Репутация: нет Всего: нет |
Я догадываюсь, что данную задачу можно решить по-другому, обязательно посмотрю модуль EV. Но смысл не в том чтобы решить именно эту задачу, а смысл в том чтобы решить её при помощи потоков или по-крайней мере определиться что потоками её на данном этапе развития модуля threads не решить
|
|||
|
||||
| tolkien |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 277 Регистрация: 5.4.2008 Репутация: 4 Всего: 4 |
В самом деле сделайте через процессы. Переделывать практически ничего не придется. Зато если будет работать на ура. Значит кривые потоки.
|
|||
|
||||
| FishHunter |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 12.2.2009 Репутация: нет Всего: нет |
ок попробую, токо для меня "практически ничего" значит все PS что-то модуль EV совсем пытается взорвать мне мозг PSS победил я сию ошибку, достаточно было буфер вывода почистить STDOUT->autoflush(1); но теперь скрипт вылетает (после долгой работы, раз в 5 дольше работает чем раньше) с сообщением Alarm clock :( это типа сигнал ALRM от системы? ставил $SIG{ALRM} = 'IGNORE'; не помогло :( Это сообщение отредактировал(а) FishHunter - 12.2.2009, 23:46 |
|||
|
||||
| NuINu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: 5 Всего: 6 |
FishHunter, на мой взгляд вы не правильно используете потоки, что это за фигня создаем 50 потоков, потом ждем пока они завершатья, потом еще создаем 50 потоков и т.д.
потоки должны РАБОТАТЬ! нужно создать 50 потоков и ВСЕ! дальше пусть они работают, а ваше дело расскидывать задания для этих потоков. вот пример как правильно
|
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
FishHunter, наткнулся на обсуждение использования потоков в Perl, почитайте.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| FishHunter |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 12.2.2009 Репутация: нет Всего: нет |
судя по этому разговору на нитки в перл можно забить Добавлено через 4 минуты и 53 секунды
Огромый респект! и большое человеческое спасибо Но проблемка alarm clock осталась, причем походу это косяк LWP, а точнее взаимодействия LWP и threads, т.к. если не пользовать LWP все пашет на ура. Есть идеи что это может быть? гугл ничего внятного что-то мне не сказал :( |
||||
|
|||||
| perloid |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 14.11.2008 Репутация: нет Всего: -1 |
так заюзайте curl c параллельными запросами, есть модуль для него.
http://search.cpan.org/~crisb/WWW-Curl-3.0...W/Curl/Multi.pm намного быстрее будет работать, чем городить огород с нитями. + существует альтернативный модуль LWP::Parallel Это сообщение отредактировал(а) perloid - 14.2.2009, 03:29 |
|||
|
||||
| NuINu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: 5 Всего: 6 |
я сам не пробовал, но вам посоветую попробовать(все равно больше ничего не остается как переделывать). модуль use Thread::Signal; скорее всего он будет работать в версиях 5.8.9 и 5.10 у меня 5.8.8 в нем в тредах нет такйо фишки как thr->kill, а значит нельзя будет передать сигнал в тред правильно. но вы попробуйте.. ЗЫ: не понимаю столь трепетной любви в людях к тредам... многие ссылаются на совместимость с виндой, в гробу я эту совместимость видел, в винде по определению ничего не должно работать!!! юзайте fork |
|||
|
||||
| NuINu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: 5 Всего: 6 |
Вот набросал мультипроцессную обработку с использованием fork, если разберешься то можно где угодно применять.
|
|||
|
||||
| FishHunter |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 12.2.2009 Репутация: нет Всего: нет |
Премного благодарен, буду изучать. Как раз хотел после ниток форки глянуть.
|
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Насчёт потоков. В современных версиях Perl используется threads вместо Thread и это принципиально.
Насчёт LWP и потоков: с threads LWP работает. А вот с LWP::Parallel я нарвался на проблемы при использовании прокси - прокси-запросы выполнены блокирующими запросами, и вся параллельность пропадает. Единственная беда с потоками - памяти уходит много, поэтому 100 потоков - это уже много. |
|||
|
||||
| kukich |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 2.12.2009 Репутация: нет Всего: нет |
Полезный код,только не могу понять зачем создавать определенное количество дочерних процессов?почему нельзя создать сразу целую кучу и убивать их,как только они завершат работу? |
||||
|
|||||
| NuINu |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 131 Регистрация: 19.7.2008 Репутация: 5 Всего: 6 |
создайте сколько хотите ), просто мене приятнее знать сколько у меня максимум процессов что бы не получтить одновременно тысячи процессов.
|
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |