Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > распараллеливание работы скрипта


Автор: lancelot555 4.11.2006, 04:06
и так.. есть файл содержащий некие слова по одному на каждой строке..
есть скрипт который берет каждое слово и на его основе генерит определеную информацию..
слов в файле от 2 до  20.. на каждое слово скрипт тратит около 4 часов..
нужно распараллелить работу скрипта так чтобы по всем словам генерация шла одновременно..
как такое реализовать  smile   smile 

Автор: -=Ustas=- 4.11.2006, 09:17
Многопоточности конечно нет, но если на никсах, то можно попробовать разделить скрипт на две части, первый файл читает спискок слов, второму файлу передаются эти слова. Т.е. читаешь список слов, и в цикле выполняешь exec на второй файл, который в качестве аргумента принимает слово. Только команду надо посылать такую, чтоб php сразу же переводился в фоновый режим, тогда у тебя в цикле откроются все слова практически одновременно.

Автор: nerezus 4.11.2006, 09:47
Вот есть такой костыль(имхо самый удобный костыль):
http://ru.php.net/manual/ru/function.pcntl-fork.php

Однако в пхп многопоточности нет. Используй python ;)
Тем более использовать пхп для подобных скриптов - это извращение.

Автор: G0rinich 8.11.2006, 14:17
Подходите к делу проще.
Зачем реализовывать многопоточность средствами РНР, если этим можно заставить заниматься ОС?
И под win и под nix из консоли можно запустить любое кол-во экземпляром одного и того же скрипта. Запускаем и пусть работают 20 одинаковых скриптов.
При этом придется решить проблему, чтобы каждый скрипт работал со своим словом. Для этого слова лучше всего хранить в БД.
Алгоритм следующий. Запускаем n копий скрипта. Все копии рвутся в базу. Первая дорвавшаяся блокирует таблицу, считывает запись, помечает ее считанной, разблокирует таблицу. Когда скрипт обработает взятое слово, то он опять рвется в базу, блокирует таблицу, помечает свое слово обработанным, берет следующее слово и разблокирует таблицу. Т.о. разные экземпляры скриптов в несколько потоков обрабатывают все слова и не мешают друг другу.


ВАЖНО!!!
Я не знаю что может скрипт делать 4 часа, но если он тратит столько времени, то он явно сильно напрягает систему. А если так, то несколько экземпляров такого скрипта скажут системе ЗАМРИ. Поэтому лучше обрабатывать слова по очереди.

Web пауки так и пишутся. Информация собирается в несколько потоков, а разбирается только одним. Т.к. очень часто при этом приходится использовать Regexp, а это не малая нагрузка на процессор.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)