Есть сервис(ATL). Этот сервис обрабатывает клиентские запросы, используя именнованный канал и порт завершения ввода-вывода. Встал вопрос в организации пула потоков на сервисе.
В книге Рихтера есть небольшая заготовка типа:
1) При инициализации службы нужно создать число потоков равное g_nThreadsMin, каждый из которых будет выполнять одну и туже функцию для пула потоков
2) Помимо g_nThreadsMin должно быть установлено предельное значение числа потоков g_nThreadsMax.
В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать. Может кто-нибудь работал с этим. Отзовитесь.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Не совсем понятно о чем идет речь, так как у Рихтера книг много. AS>Все равно рекомендую прочитать это.
Можешь еще посмотреть мою статью про написании ISAPI-расширений на этом сайте. Там есть рабочий пример пула. Только размер пула там фиксирован, но при желании сможешь легко допилить его, чтобы он мог ресайзиться.
Здравствуйте, DMA, Вы писали:
DMA>Есть сервис(ATL). Этот сервис обрабатывает клиентские запросы, используя именнованный канал и порт завершения ввода-вывода. Встал вопрос в организации пула потоков на сервисе. DMA> В книге Рихтера есть небольшая заготовка типа: DMA>1) При инициализации службы нужно создать число потоков равное g_nThreadsMin, каждый из которых будет выполнять одну и туже функцию для пула потоков DMA>2) Помимо g_nThreadsMin должно быть установлено предельное значение числа потоков g_nThreadsMax.
DMA>В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать. Может кто-нибудь работал с этим. Отзовитесь.
Можешь посмотреть MS SOAP ToolKit. Самая первая версия распространялась с исходниками. ISAPI extension (собственно SOAP engine) там был с реализацией пула потоков. Очередь запросов была реализована на CompletionPorts.
Здравствуйте, DMA, Вы писали:
DMA>Есть сервис(ATL). Этот сервис обрабатывает клиентские запросы, используя именнованный канал и порт завершения ввода-вывода. DMA>Встал вопрос в организации пула потоков на сервисе.
Сначала надо придумать как ты данные из канала будешь обрабатывать разными потоками. Как будешь синхронизироваться. И т.д и т.п.
Скорее всего, после обдумывания, ты откажешься от пула потоков.
DMA>1) При инициализации службы нужно создать число потоков равное g_nThreadsMin, каждый из которых будет выполнять одну и туже DMA> функцию для пула потоков
Так и есть, а ещё надо создать объект ядра "порт завершения ввода вывода" и ассоциировать с ним твой именованный канал.
DMA>2) Помимо g_nThreadsMin должно быть установлено предельное значение числа потоков g_nThreadsMax.
Это можно не делать. У Рихтера приведён пример эвристической функции для управления количеством потоков. В простом случае это не надо.
DMA>В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать.
Заготовка какой именно функции?
DMA>Может кто-нибудь работал с этим. Отзовитесь.
Я пробовал применять и все работало. Но позже я от IO completion port отказался, не подошло для моей задачи.
Так что подумай как следует и вопрос сформулируй конкретнее. Успехов.
ICQ #311116826
Re[2]: Организация пула потоков
От:
Аноним
Дата:
23.01.03 20:50
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Здравствуйте, DMA, Вы писали:
AS>[]
DMA>>В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать. Может кто-нибудь работал с этим. Отзовитесь.
AS>Не совсем понятно о чем идет речь, так как у Рихтера книг много.
Наверное почти все из нихе как минимум просматривал. В данном случае я говорил о книге "Программирование серверных приложений для Windows 2000" AS>Все равно рекомендую прочитать это.
А эту статью(вернее ее русский вариант) я читал в книге тоже Рихтера "Программирование для Windows с учетом специфики 64 разрядной версии"(для профессионалов).
Здравствуйте, AndreyT, Вы писали:
AT>Здравствуйте, DMA, Вы писали:
DMA>>Есть сервис(ATL). Этот сервис обрабатывает клиентские запросы, используя именнованный канал и порт завершения ввода-вывода. Встал вопрос в организации пула потоков на сервисе. DMA>> В книге Рихтера есть небольшая заготовка типа: DMA>>1) При инициализации службы нужно создать число потоков равное g_nThreadsMin, каждый из которых будет выполнять одну и туже функцию для пула потоков DMA>>2) Помимо g_nThreadsMin должно быть установлено предельное значение числа потоков g_nThreadsMax.
DMA>>В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать. Может кто-нибудь работал с этим. Отзовитесь.
AT>Можешь посмотреть MS SOAP ToolKit. Самая первая версия распространялась с исходниками. ISAPI extension (собственно SOAP engine) там был с реализацией пула потоков. Очередь запросов была реализована на CompletionPorts.
Да было бы очень интересно глянуть, тем более что в рамках всего проекта и с SOAP приходилось разбираться(правда у меня стоит MS SOAP Toolkit Version 3.0). Так что еще раз посмотрел семплы, но ничего с пулом потоков там нет. Если у Вас сохранилась старая версия самого тулкита или семпл ISAPI extension, то буду рад ощутить его у себя на мыле(). Заранее спасибо.
Здравствуйте, Максим Алексейкин! Спасибо большое за ваш ответ. Вы писали:
МА>Здравствуйте, DMA, Вы писали:
DMA>>Есть сервис(ATL). Этот сервис обрабатывает клиентские запросы, используя именнованный канал и порт завершения ввода-вывода. DMA>>Встал вопрос в организации пула потоков на сервисе.
МА>Сначала надо придумать как ты данные из канала будешь обрабатывать разными потоками. Как будешь синхронизироваться. И т.д и т.п. МА>Скорее всего, после обдумывания, ты откажешься от пула потоков.
А насчет того, что данные из канала будут обрабатываться разными потоками. Как будет это синхронизироваться и т.д. В этом как раз и проблема не очень то себе и представляю как.
Я бы отказался, но как говорится было сказано. Значит должно быть сделано.
DMA>>1) При инициализации службы нужно создать число потоков равное g_nThreadsMin, каждый из которых будет выполнять одну и туже DMA> функцию для пула потоков
МА>Так и есть, а ещё надо создать объект ядра "порт завершения ввода вывода" и ассоциировать с ним твой именованный канал.
Для одного именованного канала, ассоциированного с "IO Completion Port" проблем никаких все работает и все классно.
DMA>>2) Помимо g_nThreadsMin должно быть установлено предельное значение числа потоков g_nThreadsMax.
МА>Это можно не делать. У Рихтера приведён пример эвристической функции для управления количеством потоков. В простом случае это не надо.
DMA>>В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать.
МА>Заготовка какой именно функции?
В книге Рихтера и Кларка "Программирование серверных приложений для Windows 2000" ее заготовка определена так DWORD WINAPI ThreadPoolFunc(PVOID pv){} И именно эта функция должна выполняться для всех потоков.
DMA>>Может кто-нибудь работал с этим. Отзовитесь.
МА>Я пробовал применять и все работало. Но позже я от IO completion port отказался, не подошло для моей задачи.
МА>Так что подумай как следует и вопрос сформулируй конкретнее. Успехов.
Раз вы пробовали, то хотелось если не жалко лицезреть ваше творчество. Точнее сказать как удалось вам все это привести в рабочее состояние. С удовольствием получил бы от вас рекомендации на е-мейл
Здравствуйте, DMA, Вы писали:
DMA>Есть сервис(ATL). DMA>В книге Рихтера есть заготовка этой функции, но на практике не получается этот пул организовать. Может кто-нибудь работал с этим. Отзовитесь.
Почему не хочешь воспользоваться пользуешься
классом CThreadPool из ATL Server Library ?
Здравствуйте, DMA, Вы писали:
DMA>Да было бы очень интересно глянуть, тем более что в рамках всего проекта и с SOAP приходилось разбираться(правда у меня стоит MS SOAP Toolkit Version 3.0). Так что еще раз посмотрел семплы, но ничего с пулом потоков там нет. Если у Вас сохранилась старая версия самого тулкита или семпл ISAPI extension, то буду рад ощутить его у себя на мыле(). Заранее спасибо.
Здравствуйте, AndreyT, Вы писали:
AT>Здравствуйте, DMA, Вы писали:
DMA>>Да было бы очень интересно глянуть, тем более что в рамках всего проекта и с SOAP приходилось разбираться(правда у меня стоит MS SOAP Toolkit Version 3.0). Так что еще раз посмотрел семплы, но ничего с пулом потоков там нет. Если у Вас сохранилась старая версия самого тулкита или семпл ISAPI extension, то буду рад ощутить его у себя на мыле(). Заранее спасибо.
AT>OK AT>отправил
Спасибо Андрей за присланный исходничек! Попробую к своему сервису прилепить его и посмотреть как это будет работать.
Здравствуйте, Максим Алексейкин, Вы писали:
МА>Я пробовал применять и все работало. Но позже я от IO completion port отказался, не подошло для моей задачи.
МА>Так что подумай как следует и вопрос сформулируй конкретнее. Успехов.
Хотелось бы все таки увидеть как вам все-таки удалось заставить это дело работать...
Заранее благодарен, Дмитрий Марудов[DMA].
Реализация была почти как у Рихтера. Данные передавались через сокеты по пакетно. Проблема была именно в том что данные одного пакета могли начать обрабатываться двумя потоками. В данном случае можно было бы использовать пакеты фиксированной длины и выдавать запросы на чтение нужного числа байт. Но у меня пакеты разной длины и обрабатываются КА с памятью. Как прикрутить обработку таких пакетов к IO completion портам я не знаю. На счет исходников, они почти один в один Рихтеровские.