Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по boost::asio 
V
    Опции темы
Artemon
Дата 26.2.2011, 16:10 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Наслышан о том что с помощью asio можно написать сервер, который при прочих равных условиях выдержит большее число подключений чем сервер работающий по модели ОДИН КЛИЕНТ-ОДИН ПОТОК.

Вопрос:
Есть машинка с одноядерным процессором, на сервере производится длительная операция обращения к БД. Как в asio сделать так чтобы пока идет
работа с БД - остальные клиенты не проставивали ?

P.S.
С многопоточным сервером все понятно, пока идет длительная операция - остальные потоки работают, разделяя общее процессорное время.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Abyx
Дата 26.2.2011, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



выносить операцию с бд в поток %)
я хз как связана ваша бд и asio
PM MAIL   Вверх
bsa
Дата 26.2.2011, 20:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Artemon, asio - это аббревиатура от асинхронного ввода вывода.
Там смысл несколько отличный от стандартных представлений. Если тебе надо что-то сделать, то ты вызываешь соответствующий метод передавая ему функтор, который должен быть вызван по завершении операции. Когда операция завершается, этому функтору передается код завершения (ok или ошибка). И ты из этого функтора уже заказываешь выполнение следующего действия... Таким образом, ты никогда не сидишь и не ждешь, пока выполнится какое-либо действие - в это время может выполняться другое.

Например, у тебя есть твой вэб-сервер, работающий с БД. При запуске сервера ты ставишь задачу: установить TCP соединение с сервером БД

И запускаешь io_service.run()...
Как только у тебя происходит установка связи с БД вызывается соответствующий функтор, и если все в порядке, ты посылаешь команду авторизации... После ее отправки ты ставишь задачу ожидания результата авторизации. В случае успешного результата ты отправляешь команду на открытие БД... Короче, работа с БД установлена. Теперь можно открыть TCP порт 80 в режиме приема соединений, ставишь соответствующую задачу.

При подключении очередного клиента ты опять ставишь задачу приема соединений, а так же задачу получения от него данных. Когда ты их получишь, ты ставишь задачу оправки запроса к БД... В это же время может быть принят другой клиент... 
PM   Вверх
Artemon
Дата 26.2.2011, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Цитата

выносить операцию с бд в поток %)


Я ищу вариант чтобы от этого УЙТИ.

Цитата(bsa @  26.2.2011,  20:14 Найти цитируемый пост)
Когда ты их получишь, ты ставишь задачу оправки запроса к БД... В это же время может быть принят другой клиент... 


Каким образом он будет принят если основной поток (и единственный) трудится над выборкой из БД ?

Допустим я получил соединение от клиента, клиент запросил какие-то данные, чтобы эти данные выбрать из БД нужен огромный и сложный запрос, выполняющийся продолжительное время. Заранее не известно что будет запрошено.
Собственно когда я начинаю выполнять такой запрос я НЕ могу больше приянть соединение от клиента т.к. основной поток выполнения занят задачей выборки из БД.

Сейчас все хорошо работает в многопоточном сервере, но я ищу пути оптимизации и решил приглядеться к asio, но наткнулся на такой затык.




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
bsa
Дата 26.2.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Artemon, раз ты такие вопросы задаешь, значит ты не понимаешь, как работает asio.

постановка задачи занимает практически нулевое время. Другими словами, функция постановки возвращается тут же. Долгий запрос будет выполняться в "фоне". Т.е. ты не должен ждать, когда он завершится. Ты поставил задачу отправить запрос к БД и все. Когда задача будет выполнена будет вызвана твоя функция, в которой ты только поставишь задачу "принять данные от БД" и все. После успешного приема данных от БД, ты ставишь задачу "отправить данные клиенту"...

Посмотри внимательно примеры под asio.
PM   Вверх
Artemon
Дата 26.2.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



насколько я понял у asio есть 2 основных метода sync_read и sync_write в которые мы передаем  методы, которые выполнятся по завершению чтения или записи.

Допусти я сделал что-то типа  этого:

Код

void Read()
{
boost::sync_read(ReadHandler);
}

void ReadHandler()
{
   SELECT * FROM BIG_TABLE;

   start_accept_new_client();
}


Когда завершится чтение - начнет выполняться метод ReadHandler. Но с чего это он будет выполняться в Фоне ?




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
boostcoder
Дата 27.2.2011, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Artemon @  26.2.2011,  23:05 Найти цитируемый пост)
у asio есть 2 основных метода sync_read и sync_write

нет.
есть синхронные(блокирующие): read() и write(). и есть асинхронные(не блокирующие): async_read() и async_write().

Цитата(Artemon @  26.2.2011,  16:10 Найти цитируемый пост)
Как в asio сделать так чтобы пока идет работа с БД - остальные клиенты не проставивали ?

по хорошему, должен быть пул потоков в котором выполняется asio::io_service::run.
в таком случае, если пул интеллектуальный, он сам, в зависимости от thread_sleep_time(не знаю как на русском сказать), производит регулирование числа потоков.
при этом, вы, свой долгий_запрос_к_БД, можете запостить как любую асинхронную задачу. смотрите: http://www.boost.org/doc/libs/1_46_0/doc/h...rvice/post.html
это позволит интеллектуальному пулу потоков, учитывать время затрачиваемое на этот запрос. и он(интеллектуальный пул потоков) примет этот факт во внимание, и в зависимости от политики пула, он, возможно, будет добавлять/убавлять кол-во потоков.

Цитата(Artemon @  26.2.2011,  23:05 Найти цитируемый пост)
Когда завершится чтение - начнет выполняться метод ReadHandler. Но с чего это он будет выполняться в Фоне ?

не понял вопроса..

Это сообщение отредактировал(а) boostcoder - 27.2.2011, 02:26
PM WWW   Вверх
bsa
Дата 27.2.2011, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Artemon, ты все перепутал.
Код
void MyClass::onClientAccepted(Client *client, const boost::system::error_code &ec)
{
    if  (!ec) {
       startAccepting();//ставим задачу ожидания подключения следующего клиента
       client->startReading();
    }
}
void Client::onReceived(buffer &buf, const boost::system::error_code &ec)
{
      if (ec)
          return;
      //что-то тут делаем
      db.query(query, boost::bind(&Client::onQueryComplete, this, _1, _2));
}
void Client::onQueryComplete(buffer &buf, const boost::system::error_code &ec)
{
    //что-то
    socket_.async_write(..., boost::bind(&Client::onSended, this, ...), ...);
}

PM   Вверх
Artemon
Дата 27.2.2011, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



boostcoder, 

Цитата(boostcoder @  27.2.2011,  00:35 Найти цитируемый пост)
при этом, вы, свой долгий_запрос_к_БД, можете запостить как любую асинхронную задачу. смотрите: http://www.boost.org/doc/libs/1_46_0/doc/h...rvice/post.html


Подозреваю что эта асинхронная задача будет реализовываться с помощью потока. Если для каждого клиента создавть такие задачи, то какой выигрышь от ухода от модели один клиент-один поток?

На счет интеллектуальности - для начала хотелосьбы разобраться, удастся реализовать сервер используя лишь один основной поток + асинхронные вызовы asio.


Цитата(bsa @  27.2.2011,  12:36 Найти цитируемый пост)
//что-то тут делаем      db.query(query, boost::bind(&Client::onQueryComplete, this, _1, _2));

Каким образом данная строка выполнится асинхонно ?
Как раз таки я и думаю что затык будет именно в этом месте (возможно ошибаюсь).

Это сообщение отредактировал(а) Artemon - 27.2.2011, 18:31


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
boostcoder
Дата 27.2.2011, 18:47 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Artemon @  27.2.2011,  18:30 Найти цитируемый пост)
Подозреваю что эта асинхронная задача будет реализовываться с помощью потока. Если для каждого клиента создавть такие задачи, то какой выигрышь от ухода от модели один клиент-один поток?

RTFM smile 
PM WWW   Вверх
bsa
Дата 27.2.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Artemon, основное время при работе по сети расходуется на ожидание ответа от удаленной машины. Это может делать как ядро системы, так и приложение. Отличия только в том, какой вызов используется. Есть синхронный, а есть асинхронный. Отличия в том, что если первый ждет завершения выполнения операции, то второй не ждет. При завершении операции приходит определенный сигнал. Вот asio с этим и работает.
PM   Вверх
xvr
Дата 28.2.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



asio не позволяет выполнять какую то работу параллельно с другой работой, она позволяет выполнять ввод/вывод параллельно с другой работой. Что бы обращение к BD было асинхронным, оно должно быть оформлено в виде отправки запроса через сеть (например запись текста SQL запроса в пайп), и дальнейшего чтения ответа опять же через сеть.

В таком случае asio позволит время от отправки запроса и до получения ответа использовать для обслуживания других клиентов

PM MAIL   Вверх
boostcoder
Дата 28.2.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(xvr @  28.2.2011,  16:54 Найти цитируемый пост)
 Что бы обращение к BD было асинхронным, оно должно быть оформлено в виде отправки запроса через сеть

во первых - зачем?
во вторых - а если БД локальная, какой смысл в interprocess-comunication?

PM WWW   Вверх
xvr
Дата 28.2.2011, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(boostcoder @ 28.2.2011,  18:47)
Цитата(xvr @  28.2.2011,  16:54 Найти цитируемый пост)
 Что бы обращение к BD было асинхронным, оно должно быть оформлено в виде отправки запроса через сеть

во первых - зачем?

Это вопрос к ТС, а то он пытается от asio добиться каких то чудес  smile 
Цитата

во вторых - а если БД локальная, какой смысл в interprocess-comunication?
Никакого. Смысл будет, если БД удаленная

PM MAIL   Вверх
Artemon
Дата 1.3.2011, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Чудес я добиться не пытаюсь, а хочу лишь понять насколько реально сделать сервер на asio, под сервером я НЕ имею ввиду простейшие чаты, эхо серверы и прочее, а серьезный сервер, выполняющий сотни различных команд, делающий сложный выборки, реализующий часть логики клиентского приложения и т.д.

При модели один поток-один клиент (+ блокирующие сокеты), все это можно сделать без какого-либо шаманства.
Изучаю asio с его асинхронной моделью, пока собственно никаких плюсов кроме асинхронной модели не обнаружил, хотя это даже не плюс, а предпосылка к тому плюсу, что можно избавится от потоков.

Тему не закрываю, хочу еще поэксперементировать и сюда запостить появившиеся вопросы.


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2303 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.