Автор Тема: многопотоковая обработка данных  (Прочитано 3276 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Вообщем так:
Имеем следующие данные.
url11 url12 url13... url1n
.......
urlm1 urlm2 ... urlmn

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

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


Мне больше непонятен п1. Как создать новый процесс понятно:) Мне не понятно как координировать скриптом работу многих процессов одновременно.
Т.е. как я понимаю, я должен основной программы читать данные для обработки, а потом построчно "скарливать" процессам", и получая ответ заносить в базу данных.
Ну к чему все это, лучше бы водки выпили...

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
многопотоковая обработка данных
« Ответ #1 : 05 Мая 2004, 22:37:27 »
perldoc perlipc
perldoc -f fork
+ в базу можно писать несколькими процессами
Т.е. процесс проверяет валидность ссылки и записывает данные о ней в базу.
2B OR NOT 2B = FF

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
многопотоковая обработка данных
« Ответ #2 : 05 Мая 2004, 22:43:53 »
Chs, проблема в том, чтобы два процесса не стали проверять валидность одной и той ссылки.
Отправился читать перлдок...:)
Ну к чему все это, лучше бы водки выпили...

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
многопотоковая обработка данных
« Ответ #3 : 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

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
многопотоковая обработка данных
« Ответ #4 : 06 Мая 2004, 11:12:13 »
Ну каждый реализует эту проблему как хочет - могу подарить простой вариант:
запускаешь n-скриптов(хоть из крона, хоть как), каждый из них считывает из своего текстового файла свою ссылку и проверяет ее, записывает в базу результат.
Как разбить один большой массив ссылок на n текстовых файлов надо объяснять?
Код скрипта может быть один и зависеть например от имени скрипта.:)
2B OR NOT 2B = FF

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28