Цитата:
Сообщение от supernewbie
идея в следующем (далее псевдокод):
Код:
переменные на каждый поток:
общий_сетевой_буфер = массив байт равный максимальному размеру пакета (65535 в нашем случае)
боты = список ботов для обработки
тело_потока:
для каждого бота в ботах потока делаем:
{
бот.установить_буфер(общий_сетевой_буфер);
// в этом моменте бот использует общий буфер потока
// для приема и отправки данных
бот.получить_сетевые_данные_используя_буфер();
бот.послать_данные_используя_буфер();
бот.аннулировать_буфер();
// в этом моменте у бота больше нет буфера
// в следующей итерации общий буфер перейдет к следующему боту
}
|
Повторюсь, экономить потоки это хорошая идея. Но делать это надо не так. В том что ты предлагаешь следующие проблемы:
1) ручная балансировка ботов между потоками
2) прием данных бывает либо блокирующий, что в твоем случае не подходит. либо асинхронный. что в твоем случае не подходит. либо активное ожидание - привет дополнительные задержки и излишний расход процессорного времени.
И снова мы приходим к тому что код должен быть полностью асинхронный. А в асинхронном коде ограничение на неразрывность обработки одного пакета является злом. Вот захочу я посреди обработки пакета отправить пакет другому клиенту, в этот момент я должен отпустить поток исполняющий мой код, и прощайте буфера.