Потоки или процессы?
От: Geralt  
Дата: 30.12.04 18:41
Оценка:
Необходимо реализовать приложение под UNIX, которое выполняет head запрос для большого списка URL и некоторым образом обрабатывает полученную информацию. Дополнительные требования таковы, что должен существовать один главный процесс и некоторое количество рабочих процессов. Главный и рабочие процессы должны "общаться" между собой в двух направлениях: главный процесс передает рабочему ссылку и некоторые параметры, рабочий выполняет запрос и возвращает главному результат выполнения.

Первоначально программы была реализована на перле. Сначала с форком, затем с префорком и sysv IPC, затем с использованием ithreads. Но во всех этих случаях можно было (не убивая систему) создать максимум 100 процессов, а скорость работы и нагрузка на систему оставляли желать лучшего. Сейчас я планирую переписать эту же программу на Си, но в виду полного отсутствия опыта программирования на данном языке под UNIX в общем, и многопоточных и мультипроцессорных приложений в частности, решил обратиться за советом к специалистам.

Вариантов решения задачи я вижу четыре:
1. Форк и однонаправленный канал. В родительском процессе устанавливаю URL и нужные параметры, делаю форк. В дочернем процессе выполняю запрос, результаты пишу в канал в виде отформатированной строки. В родителе читаю данные из канала. Т.е. один дочерний процесс выполнят за время своей жизни один запрос.
2. Префорк, SysV IPC и однонаправленный канал. Каждый дочерний процесс работает в цикле: получает URL и параметры из шаровой переменной, выполняет запрос, результаты, как и в предыдущем примере, пишет в канал.
3. Потоки (треды). Так же как и вариант 1 — один запрос за все время жизни дочернего потока.
4. Претрединг. Предварительно формирую нужное количество потоков. Дочерние потоки работают в цикле, получают данные из одной очереди, а результаты отправляют в другую.

Посоветуйте, пожалуйста, оптимальный вариант для решения поставленной задачи, учитывая тот факт, что запрос выполняется продолжительное время (1-3 секунды). После работы с перлом у меня остались некоторые впечатления насчет первого и второго решения. Вариант 1 сильно грузит систему (20-30 форков в секунду) а, второй вариант очень сильно тормозит использование SysV IPC, но без нее не обойтись, т.к. нужно двунаправленное взаимодействие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.