Использование API блокировки MySQL с Boost :: asio - PullRequest
2 голосов
/ 10 февраля 2010

Я создаю однопоточный сервер Aync, который получает данные от клиентов. Он обрабатывает данные и затем сохраняет их в базе данных MySQL.

Проблема в том, что MySQL C API не поддерживает неблокирующие вызовы, а asio в основном не любит блокирующие вызовы.

Так что я думаю о семантике типа Python Twisted deferToThread (). Есть ли кто-нибудь, кто уже разработал такую ​​вещь? Или я должен это реализовать?

Ответы [ 3 ]

3 голосов
/ 18 марта 2012

Может быть, вам будет интересна эта асинхронная клиентская библиотека MySQL на базе Asio с именем Amy: https://github.com/liancheng/amy

Цитируется по GitHub README:

Amy - это совместимый только с C ++ 11 заголовок A синхронный Моя клиентская библиотека SQL на основе Boost.Asio. Это позволяет вам работать с MySQL как асинхронным, так и блокирующим способом.

2 голосов
/ 30 августа 2010

За лето было сообщение в списке рассылки Asio , описывающее общий асинхронный класс обслуживания, который, кажется, может быть полезен для вас. Этот псевдокод взят из электронной почты автора, на которую я ссылался:

// Create a command processor with 5 threads allocated
// to processing the commands.
async_command_processor processor(io_service, 5);

// Execute the command asynchronously and call the
// MyCommandComplete callback when completed.
processor.async_execute(MyCommand, MyCommandComplete);
0 голосов
/ 10 февраля 2010

чтобы "выстрелить и забыть" нить. Вы можете создать класс с помощью operator () и переменные-члены с данными для записи. В обработчике данных asio accept создайте один из этих классов, а затем передайте его потоку наддува. Boost thread внутренне скопирует этот класс и запустит поток. Если вы заботитесь о том, как написать оператор (), он должен завершиться, когда будет завершена запись sql, и освободить свои данные записи. Вы можете вызвать boost :: thread :: detach, чтобы забыть о потоке и просто дать ему завершиться, а затем умереть. Таким образом, вы запускаете новые потоки, которые пишут в mysql из ваших обработчиков asio. Я не уверен, что происходит с данными члена, когда класс потока выходит из области видимости. Дважды проверьте документы повышения, может быть проблемой, если поток повышения не завершен, и поток все еще нуждается в данных, которые ушли. Может быть, общие указатели могут помочь здесь.

...