我正在构建一个从客户端接收数据的aync单线程服务器。它处理数据,然后将其保存到MySQL数据库。
问题是,asio不支持非阻塞调用,MySQL主要不喜欢阻塞调用。
所以我在想一些类似Python Twisted的deferToThread()的东西,比如语义。有没有人已经开发出这样的东西了?或者我应该实现它?
发布于 2010-08-30 07:31:43
今年夏天,Asio邮件列表中的a post描述了一个通用的异步服务类,它似乎对您很有用。这个伪代码来自我链接的作者的电子邮件:
// 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);发布于 2012-03-18 20:35:07
也许您会对这个名为Amy:https://github.com/liancheng/amy的基于Asio的异步MySQL客户端库感兴趣
引用自GitHub自述文件:
Amy是一个符合C++11的、仅包含头的Asynchronous My客户端库,它基于Boost.Asio。它使您能够以异步和阻塞方式使用MySQL。
发布于 2010-02-10 12:12:19
“发火并忘记”一条线索。您可以使用operator()创建一个类,并使用要写入的数据创建成员变量。在asio接受数据处理程序中,创建其中一个类,然后将其传递给boost线程。Boost线程将在内部复制该类并启动线程。如果您仔细考虑如何编写操作符(),那么它应该在sql写入完成时终止,并释放其写入数据。你可以调用boost:: thread ::detach来忘记线程,让它完成,然后消亡。这样,您就可以从asio处理程序发出写入mysql的新线程。我不确定当线程类超出作用域时,成员数据会发生什么。仔细检查boost文档,如果boost线程没有完成,并且线程仍然需要丢失的数据,那么可能会出现问题。也许共享指针可以在这里有所帮助。
https://stackoverflow.com/questions/2234310
复制相似问题