![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Riddick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 24.6.2007 Репутация: нет Всего: нет |
Прочитал про форки, но никак не пойму как применить. Понятно что многое об этом написано, но никак не дойдет до меня. Если не трудно, прошу Уважаемых Гуру помочь, новичку самоучке
Из кода ниже станет ясен алгоритм выполнения скрипта, а вот как сделать его многопоточным надеюсь найти ответ здесь на форуме.
Из кода понятно, что скрипт по очереди выбирает по одному запросу из фала и обрабатывает и ждать приходится "от забора и до обеда", а вот если бы он это делал многопоточно, ну хотябы в 30 или 50, то время ожидание сократилось бы в разы. Буду очень благодарен за помощь. З.Ы. Сильно не бейте, если очень туплю! |
|||
|
||||
| Ivan Kolesnikov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: нет Всего: 6 |
В Perl существует, по крайней мере, два способа организации многопоточности, это fork и собственно потоки.
Я работал только с fork, поэтому расскажу про него: когда ты делаешь системный вызов fork, то создается копия твоего процесса, при этом родительскому процессу возвращается pid только что созданного нового процесса, а дочернему процессу - ноль. В твоем случае можно многопоточность реализовать следующим образом:
Я чуток подправил код, чтобы проще было читать, да я его не проверял, так что могут быть небольшие ошибки. Но суть в следующем основной поток создает необходимое число потоков, каждый из которых знает какие данные ему необходимо обработать (он обрабатывает не все подрят, а скачет (величина прыжка равна количеству потоков). При этом основной поток сохраняет идентификаторы своих детей, чтобы в конце подождать пока они все завершаться... Если что не понятно пиши... --------------------
|
|||
|
||||
| dimes |
|
||||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 249 Регистрация: 20.7.2004 Где: то около СПБ Репутация: нет Всего: 14 |
Riddick,
Очень много ошибок в коде.
Каждый элемент @col будут заканчиваться "\n" а то и "\r\n" Это может быть принципиально. насчет этого: $col=@col; В perl много способов как пройтись по массиву
и т.д. Функция "Geturll" объявляется прямо в цикле, это все равно что грязными руками лапать прекрасное и вечное
-Это не запись а чтение -не хватает обработчика ошибок open (CC, 'text.txt') or &my_prc_err($!); -нет flock (в примере Ivan Kolesnikov это особенно важно) НЕТ "use strict;" пока не научился вставлять use strict; use CGI::Carp qw (fatalsToBrowser); ты далеко не продвинешься. еще бы хорошо -w (use warning;)
Если на той стороне что то мега ляжет или изменится у тебя зависнут скрипты, бесконечные рекурсии не самое правильно решение особенно у тебя |
||||||||||||
|
|||||||||||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 1 Всего: 50 |
Riddick, вот этот кусок твоего кода, боюсь, делает не (совсем) то, что ты хочешь. Можно долго рассказывать, что в нем нехорошо, но проще поправить. Только я, к сожалению, не понял, чего нужно добиться.
|
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: 1 Всего: 23 |
Где-то я натыкался на то, что нельзя давать детям выходить обратно в родительский код. То есть после кода, выделенного amg, не нужен exit? И, кстати, eof в нижнем регистре после <<EOF - опечатка?
-------------------- Что непонятно - спрашиваем |
|||
|
||||
| Ivan Kolesnikov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 113 Регистрация: 9.3.2005 Где: г. Новокузнецк Репутация: нет Всего: 6 |
да конечно нужен exit и на счет eof - опечатка. Просто писал сразу в браузере и не проверял работу... --------------------
|
|||
|
||||
| Riddick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 24.6.2007 Репутация: нет Всего: нет |
Большое спасибо всем, все учту и приму к сведению. Насчет ошибок в коде, тоже спасибо, хотя вроде копипастом вставлял а потом правил, поэтому и ошибки. Насчет use strict - говорили же мне сразу привыкать сразу его юзать, теперь точно начну, насчет фатал браузер и варнингов вставляю в каждый скрипт.
Еще раз всем спасибо, если возникнут вопросы, хоть знаю куда теперь обратиться. Всем респект. |
|||
|
||||
| Riddick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 24.6.2007 Репутация: нет Всего: нет |
Попробовал, браузер выдал кучу ошибок
Not enough arguments for waitpid at d:\cgi-bin\PARSER~1\parser2.cgi line 72, near "$_) " Missing right curly or square bracket at d:\cgi-bin\PARSER~1\parser2.cgi line 83, at end of line (Might be a runaway multi-line << string starting on line 77) Ну и еще, сечас проверяю, может опять я ступил |
|||
|
||||
| igor_k75 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.6.2007 Репутация: нет Всего: нет |
Можно обойтись и без fork.
LWP::Parallel - http://search.cpan.org/~marclang/ParallelU...LWP/Parallel.pm |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
igor_k75, вы сразу приведите пример его использования
;) Это сообщение отредактировал(а) nitr - 27.6.2007, 22:48 |
|||
|
||||
| Riddick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 24.6.2007 Репутация: нет Всего: нет |
Если не секрет, что такое РОЕ и где про него почитать. А так сделал на форках, в 20 потоков проц грузится на 98%, может из-за того, что Апачи стоит на Windows, потому как прочитал, форки это линуксовая стихия.
|
|||
|
||||
| sharq |
|
|||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 2 Всего: 28 |
Riddick,
http://search.cpan.org/%7Ercaputo/POE/ http://poe.perl.org/ http://perl.wikia.com/wiki/POE На русском информации очень мало, пока это только обсуждения здесь на форуме и в блогах. -------------------- [color=gray]There's More Than One Way To Do It[/color] |
|||
|
||||
| Riddick |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 24.6.2007 Репутация: нет Всего: нет |
Опять вопрос, для тех кто работает с форками и на денвере. Можно ли как нибудь уменьшить нагрузку на проц при применении Forkов, если можно напишите плиз, если нет то может можно реализовать как нибудь по другому многопоточность на стандартных модулях. Заранее спасибо!
|
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |