Вопрос

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

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

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

Это было полезно?

Решение

Там был сообщение к тому 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);

Другие советы

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

Цитируется из GitHub README:

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top