Как писать с сервер одним потоком на обработку соединений...
WinSock32
Дата: 14.10.2004 16:52:35
Здравствуйте!
Понятно, как делеать сервер, если на каждое новое подключение создаётся поток, но это (ИМХО) не правильно, особенно, когда соединений больше 100. Подскажите, без примеров кода, на словах, как примерно должен выглядеть алгоритм работы с соединениями в одном потоке, какие очереди организовывать нужно и т.п.
Спасибо.
Dedushka Mazai
Дата: 14.10.2004 17:02:17
ну это тебе виднее должно быть - ты ж у нас winsock :)
а если по существу, то если ты всю обработку запихнёшь в один поток, то, во-первых, о параллельной работе клиентов можешь забыть, а во-вторых, каждое повисшее соединение будет вешать твой сервер. имхо, конечно же
softwarer
Дата: 14.10.2004 17:05:35
Мягко говоря, не уверен, что стоит идти по этому пути. Другой вопрос, что эти множественные потоки можно облегчить, оставить им перекачку данных и передачу команд "исполнителю", который может быть отдельным потоком, ограниченным пулом потоков итп.
P.S. Именно такими серверами я никогда не занимался, но могу сказать, что у меня было приложение, в пике более трехсот потоков - все было в порядке, крутилось у меня на рабочей станции и не мешало прочей работе. То есть количество потоков само по себе не столь серьезный ресурс.
zalexaka
Дата: 14.10.2004 17:09:08
если писать надо под выньдос, почитайте Дж.Рихтера там эта тема освещена, насколько я помню
Petro123
Дата: 14.10.2004 17:13:51
WinSock32 |
Здравствуйте! Понятно, как делеать сервер, если на каждое новое подключение создаётся поток, но это (ИМХО) не правильно, особенно, когда соединений больше 100. Подскажите, без примеров кода, на словах, как примерно должен выглядеть алгоритм работы с соединениями в одном потоке, какие очереди организовывать нужно и т.п.
Спасибо. |
Прочитай про пул потоков вот и всё. Пул нужен, для искусственного ограничения количества новых коннектов. Если достигнут MAX (напр. 100), то поток клиента ждёт пока кто-нить не освободит коннект (станет 99).
Скока оптимально поспрошай на форум БД. Но думаю тебе хватит их и без ограничений и создания пула.
Выбирай дилемму:
Параллельность работы и быстрота <====> Нагрузка на сервер
WinSock32
Дата: 14.10.2004 17:42:30
В том то и дело, что на самом деле, для отправки получения данных, дотаточно одного потока, который бы клал в очередь или забирал из другой очереди и отправлял клиентам (всё, больше никаких задач бы он не выполнял). А обработка очереди велась бы уже другими потоками. Которые бы создавались когда слишком много клиентов и убивалиь, когда их мало. У меня не получается это реализовать, так как я когда потоком кладу в очередь, от разных клиентов данные смешиваются, если один клиент работет то вcё в порядке, а когда несколько, возникает путаница. Вот хотелось бы знать как это правильно делать.
softwarer
Дата: 14.10.2004 17:44:02
Petro123 |
Прочитай про пул потоков вот и всё. Пул нужен, для искусственного ограничения количества новых коннектов. |
Имхо это не совсем то. Грубо говоря, если сто пользователей установили соединение с сервером и пошли курить - на месте ожидающего сто первого я бы высказал разработчику все, что думаю о его способностях архитектора приложений.
Соответственно, если говорить о двухзвенке - такой пул (если нужен) следует организовывать внутри сервера, как я описал - чтобы конкурировали активные соединения, а не соединения вообще. В трехзвенке это делается на сервере приложений.
softwarer
Дата: 14.10.2004 17:46:22
WinSock32 |
В том то и дело, что на самом деле, для отправки получения данных, дотаточно одного потока, |
Теоретически для однопроцессорной машины достаточно вообще одного потока - а все распараллеливание делать собственным диспетчером :)
Практически - Вы пытаетесь думать "за систему" там, где этого делать не стоит.
WinSock32
Дата: 14.10.2004 17:47:39
И ещё... Если не хватает процеорного времени на работу, например, с 400 клиентами, то это не значит, что 400 потоков (по одному на каждого клиента) с этим бы справились на ура. При этом, ИМХО, если 400 соединений будет обрабатывать 10 потоков, ресурсов будет занято меньше, так как нет переключения контекстов, чем если эти же соединения будут обрабатывать 400 потоками.
Petro123
Дата: 14.10.2004 17:52:01
Грубо говоря, если сто пользователей установили соединение с сервером и пошли курить - на месте ожидающего сто первого я бы высказал разработчику все, что думаю о его способностях архитектора приложений.
================ Не так соединение из пула берётся только для выполнения команды (INSERT/ХП Run...... и т.д.). Когда берётся, то ставит флаг - ЗАНЯТО
). После отработки флаг на место. Коннект можно не разрывать. Пул при запросе (напр. экземпляра класса ADOConnection) смотрит есть ли у него НЕЗАНЯТЫЙ. Если нет и число не более 100, то создаёт (время на создание)..............
Соответственно, если говорить о двухзвенке - такой пул (если нужен) следует организовывать внутри сервера=========== Элементарно на клиенте на основе TStringList.