Forum Webscript.Ru

Программирование => Perl => Тема начата: glebushka от 05 Мая 2004, 21:27:57

Название: многопотоковая обработка данных
Отправлено: glebushka от 05 Мая 2004, 21:27:57
Вообщем так:
Имеем следующие данные.
url11 url12 url13... url1n
.......
urlm1 urlm2 ... urlmn

каждая строка - это массив ссылок на один и тот же файл, размещённый на разных интернет-серверах.
Т.е. грубо говоря, если мы введём в строке браузера url11, то сможем скачать тот же файл что и введя в браузер url12 и т.д. url1n.
Список файлов может быть очень большим, как и список линков на этот файл.
Количество линков меняется от файла к файлу.
Т.е. один файл может быть размещён на только на одном серваке, а другой может быть доступен по 20 урл.
Задача:
1) написать программу, которая бы шустро проверяла линки на "битые", и записывала бы эти данные в другую базу.
2) очень желательно отсортировать ссылки по времени отклика.

1. Очевидно, что для этого нужно организовывать несколько процессов. Т.к., наприммер, установив таймаут 60 сек программа будет ждать 60 секунд, ничего не делая, и в то же время нагрузка на сервер небольшая. Поэтому гораздо эффективнее создать 10 процессов. Тогда обработка закончится примерно в 10 раз быстрее.


Мне больше непонятен п1. Как создать новый процесс понятно:) Мне не понятно как координировать скриптом работу многих процессов одновременно.
Т.е. как я понимаю, я должен основной программы читать данные для обработки, а потом построчно "скарливать" процессам", и получая ответ заносить в базу данных.
Название: многопотоковая обработка данных
Отправлено: Chs от 05 Мая 2004, 22:37:27
perldoc perlipc
perldoc -f fork
+ в базу можно писать несколькими процессами
Т.е. процесс проверяет валидность ссылки и записывает данные о ней в базу.
Название: многопотоковая обработка данных
Отправлено: glebushka от 05 Мая 2004, 22:43:53
Chs, проблема в том, чтобы два процесса не стали проверять валидность одной и той ссылки.
Отправился читать перлдок...:)
Название: многопотоковая обработка данных
Отправлено: glebushka от 05 Мая 2004, 23:57:34
Chs, как я понял, ты предлагаешь создать именной канал?
И писать в него ссылки для проверки другими процессами?
           while (1) {
               unless (-p $FIFO) {
                   unlink $FIFO;
                   system(\'mknod\', $FIFO, \'p\')
                       && die "can\'t mknod $FIFO: $!";
               }

               # next line blocks until there\'s a reader
               open (FIFO, "> $FIFO") || die "can\'t write $FIFO: $!";
               print FIFO "John Smith (smith\\@host.org)\\n", `fortune -s`;
               close FIFO;
               sleep 2;    # to avoid dup signals
           }

Пример в перлдоке вроде ясен. Не ясно другое.
Запустить 10 копий скрипта-обработчика вызвать, я думаю самое простое, через system.
Которые будут делать одно и тоже, читать информацию из именновонного канала, и обрабатывать её.
Не понятно,
1) как основной программе определить, прочитана ли данные из канала, и следует ли туда записывать новые данные, или ждать пока прочитают.
2) как из основной программы определить, что все скрипты отработали, и можно сообщить об этом в лог файл и/или юзеру на экран.
3) Правильно ли я понял, что при чтении именного канала прочитанная информация из него удаляется?
А зачем мне использовать fork. Мне же не надо запускать копию текущей программы? Или надо?:)
Название: многопотоковая обработка данных
Отправлено: Chs от 06 Мая 2004, 11:12:13
Ну каждый реализует эту проблему как хочет - могу подарить простой вариант:
запускаешь n-скриптов(хоть из крона, хоть как), каждый из них считывает из своего текстового файла свою ссылку и проверяет ее, записывает в базу результат.
Как разбить один большой массив ссылок на n текстовых файлов надо объяснять?
Код скрипта может быть один и зависеть например от имени скрипта.:)