Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > помогите по fork |
Автор: DooZ 25.1.2007, 17:26 | ||
есть скрипт:
суть в следующем все прекрастно работает, НО родительский процесс висит по комманде top со 100% нагрузкой на процессор я понимаю что вот в этом куске все дело: while(1) { my $status=waitpid(-1,&WNOHANG); $forks-- if $status>0; last if $status<=0; } т.е. он грузит НО! если поставить например sleep(1) теряется скорость, т.е. процессы порождаются каждую секунду это не верно и долго! помогите как быть? заранее сенькс |
Автор: DooZ 26.1.2007, 10:40 |
неужели никто не сталкивался с такой проблемой? может предложите иной способ юзания форка что бы не было нагрузки от родительского процесса? |
Автор: Ivan Kolesnikov 29.1.2007, 06:17 |
DooZ, я делал следующим образом: имеется PIPE в который дочернии потоки могут писать, а основной может читать. При этом дочерний поток при своем завершении записывает в PIPE какую-нибудь строку (например свой PID, но в принципе в данном случае это не важно). Основной поток с цикле создает максимальное число потоков, а после этого начинает читать из PIPE, как только он прочитал очередную строку значит один из потоков завершился, и можно создать еще один. Так делаем до тех пор пока есть данные для обработки после того как их не стало надо дождаться завершения работы дочерних потоков для этого мы делаем цикл по числу созданных потоков (их число в данный момент равно максимальному) и на каждой итерации читаем из PIPE очередную строку. В общем вот так, почитать про PIPE и вообще про межпроцессорное взаимодейсвие можно так: perl perlipc Если не понятно, то распишу поподробнее... |
Автор: DooZ 29.1.2007, 11:48 |
сенькс за ответ но я решил все этим модулем: Parallel::ForkManager очень удобная вещь |