首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Boost::asio中使用Mysql阻塞API

在Boost::asio中使用Mysql阻塞API
EN

Stack Overflow用户
提问于 2010-02-10 11:57:34
回答 3查看 2.1K关注 0票数 2

我正在构建一个从客户端接收数据的aync单线程服务器。它处理数据,然后将其保存到MySQL数据库。

问题是,asio不支持非阻塞调用,MySQL主要不喜欢阻塞调用。

所以我在想一些类似Python Twisted的deferToThread()的东西,比如语义。有没有人已经开发出这样的东西了?或者我应该实现它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-30 07:31:43

今年夏天,Asio邮件列表中的a post描述了一个通用的异步服务类,它似乎对您很有用。这个伪代码来自我链接的作者的电子邮件:

代码语言:javascript
复制
// 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);
票数 2
EN

Stack Overflow用户

发布于 2012-03-18 20:35:07

也许您会对这个名为Amy:https://github.com/liancheng/amy的基于Asio的异步MySQL客户端库感兴趣

引用自GitHub自述文件:

Amy是一个符合C++11的、仅包含头的Asynchronous My客户端库,它基于Boost.Asio。它使您能够以异步和阻塞方式使用MySQL。

票数 3
EN

Stack Overflow用户

发布于 2010-02-10 12:12:19

“发火并忘记”一条线索。您可以使用operator()创建一个类,并使用要写入的数据创建成员变量。在asio接受数据处理程序中,创建其中一个类,然后将其传递给boost线程。Boost线程将在内部复制该类并启动线程。如果您仔细考虑如何编写操作符(),那么它应该在sql写入完成时终止,并释放其写入数据。你可以调用boost:: thread ::detach来忘记线程,让它完成,然后消亡。这样,您就可以从asio处理程序发出写入mysql的新线程。我不确定当线程类超出作用域时,成员数据会发生什么。仔细检查boost文档,如果boost线程没有完成,并且线程仍然需要丢失的数据,那么可能会出现问题。也许共享指针可以在这里有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2234310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档