Boost.Fiber автоматически уступает сетевым запросам, таким как вызов базы данных по сети?

Срабатывает ли Boost.Fiber автоматически при сетевых запросах (если я правильно понимаю, они выдают ЦП во время ввода-вывода), например при обращении к базе данных по сети? Я хочу использовать его для настройки блокирования вызовов базы данных, когда я вставляю много информации и у меня есть много небольших записей, которые нужно вставлять при получении. Мой другой выбор был бы libdill / libmill для микропоточности.

Общая идея будет:

  1. получить данные
  2. создать волокно и передать ему данные
  3. Fibre получает соединение с базой данных и отправляет запрос INSERT (libpqxx с postgres)
  4. другие волокна работают и могут обращаться к базе данных, пока запрос базы данных находится в полете
  5. запрос возвращается из базы данных, обрабатывает ошибки и обрабатывает ответ

Волокна работают так, как я себе это представляю?

Это упрощенная базовая структура для кода, использующего RapidJSON и boost.fiber, но я получаю сообщения из сети (websocket):

inline
void doDatabaseCall( Document &msg ) {
//Get connection & do query with libpqxx
}

Document msg;
msg.Parse( "{\"myVar\": \"test\"}" );
Document msg2;
msg2.Parse( "{\"myVar\": \"test2\"}" );
boost::fibers::fiber f1( doDatabaseCall, msg);
boost::fibers::fiber f2( doDatabaseCall, msg2);
f1.join();
f2.join();

0

Решение

Срабатывает ли Boost.Fiber автоматически при сетевых запросах (если я правильно понимаю, они выдают ЦП во время ввода-вывода), например при обращении к базе данных по сети?

Нет, они этого не делают.

То, что вы, похоже, ищете, это Boost Coroutines в сочетании с Boost Asio для асинхронного ввода-вывода. Oни будут Уступать.

Существуют библиотеки для операций с базами данных, которые используют Asio для асинхронного выполнения (например, Эми) или WebSockets (например, Boost Beast)

1

Другие решения

boost.fiber интегрируется с boost.asio — вам нужно установить специальный планировщик — примеры приведены в примерах boost.fiber / sub-directory).

int main( int argc, char* argv[]) {
try {
std::shared_ptr< boost::asio::io_service > io_svc = std::make_shared< boost::asio::io_service >();
boost::fibers::use_scheduling_algorithm< boost::fibers::asio::round_robin >( io_svc);

// server
tcp::acceptor a( * io_svc, tcp::endpoint( tcp::v4(), 9999) );
boost::fibers::fiber( server, io_svc, std::ref( a) ).detach();

// client
const unsigned iterations = 2;
const unsigned clients = 3;
boost::fibers::barrier b( clients);
for ( unsigned i = 0; i < clients; ++i) {
boost::fibers::fiber(
client, io_svc, std::ref( a), std::ref( b), iterations).detach();
}
io_svc->run();

std::cout << "done." << std::endl;
return EXIT_SUCCESS;
} catch ( std::exception const& e) {
print("Exception: ", e.what(), "\n");
}
return 0;
}
0

По вопросам рекламы [email protected]