LINUX.ORG.RU

boost сервер без io_service.run()

 , ,


0

1

Доброго дня! Есть большой cfd-код (cfd==computational fluid dynamics), общее время работы которого измеряется сутками. Работает на удаленных серверах, под MPI, состоит из главного цикла с разной вычислительной требухой внутри. В секунду успевает пройти от нескольких до нескольких сотен циклов (зависит от сетки). Хочется из локальных клиентов иногда «заглядывать» в этот счет (сервер), на предмет опроса его состояния. Однако, тормозить вычисления никак нельзя.

Решил познакомиться с boost.asio. Однако, для реагирования на запросы клиентов, нашёл там только возможность параллельно с моим вычислением запустить thread с io_service, чей бесконечный цикл обработки, боюсь, загрузит мне одно из ядер, чего хотелось бы избежать. Представляется, что решением было бы совместить мой вычислительный цикл с циклом обработки событий класса io_service.

Конечно, правильным было бы учить новую для меня матчасть и тестировать разные тесты - вы, безусловно, правы - но осмелюсь, экономии времени ради, задать вопрос.

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

Заранее спасибо!


чей бесконечный цикл обработки, боюсь, загрузит мне одно из ядер, чего хотелось бы избежать

Если он у тебя будет обрабатывать кучу соединений, то да, загрузит. И куда бы ты его не выносил - он будет грузить CPU.

Если соединения будут приходить очень редко, то тред ничего грузить не будет. Он вообще не будет ничего делать пока не придёт очередной запрос на соединение. man poll epoll - это то, что скорее всего используется внутри asio.

Deleted
()

http://www.boost.org/doc/libs/1_42_0/doc/html/boost_asio/reference/io_service... Это если ты вообще хочешь обойтись без отдачи им целого потока. Но тебе правильно сказали, если данных для обработки нет, то и проц никто грузить не будет.

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)
Ответ на: комментарий от Gvidon

Это если ты вообще хочешь обойтись без отдачи им целого потока.

ИМХО в случае отсутствия соединений это как раз таки создаст небольшую дополнительную нагрузку.

Deleted
()

Не вникал в написанное, но с виду не нужно даже отдельного потока, нужно у того же io_service периодически вызывать в вычислительном цикле http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/io_service... либо http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/io_service...

asaw ★★★★★
()
Последнее исправление: asaw (всего исправлений: 1)

Благодарю всех откликнувшихся!! Действительно,

io_service service;
for(;;) {
  // что-то достаточно долгое
  service.poll();
}
не блокирует цикл, совершенно не тормозит, однако нормально отрабатывает запросы клиентов.

a92
() автор топика
Ответ на: комментарий от a92

А оно разве не наоборот - замедляет?

Ведь пока отрабатывает service.poll() вычисления простаивают.

anatoly
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.