- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想使用 boost asio 创建一个 http 客户端。为了结构化和优化,我研究了 boost asio 的示例,以了解一个好的实现应该是什么样子。
大多数情况下,我遵循了 HTTP Server 的结构,所以我有一个连接管理器,它包含一组指向每个单独连接的指针。现在,这里最大的区别是已经在 server.cpp 的构造函数中调用了一个异步函数,即
acceptor_.async_accept(new_connection_->socket(), boost::bind(&server::handle_accept, this, boost::asio::placeholders::error));
在 winmain.cpp 中,io_service 是通过对 server::run() 的函数调用启动的:
io_service_.run();
在我的实现中,因为它是客户端而不是服务器,所以我想在开始连接到服务器之前等待用户调用 send() 函数。因此,我已将所有与连接到服务器相关的函数调用移动到连接类中。当用户请求向服务器发送消息时,将调用以下内容:
resolver.async_resolve(query, boost::bind(&connection::handle_resolve, boost::ref(*this), boost::asio::placeholders::error, boost::asio::placeholders::iterator));io_service_.run();
我想在一个单独的线程中启动每个连接对象,这确实是我的问题的背景。我该怎么做才能获得结构化和优化的代码?
我试过了,如HTTP Server 2例如,设置一个 io_services 线程池并为它们分配工作,以便它们在停止之前不会返回。这似乎是个好主意,因为我会让 io 服务一直在后台运行。因此,我从相当于 server.cpp 的线程中启动线程池:
boost::thread t(boost::bind(&geocast::enabler::io_service_pool::run, &io_service_pool_));
但是,根据我自己的试错分析,似乎您无法在发出异步函数之前启动 io_service,是这样吗?因为我的程序卡住了。在我的例子中,我只想在用户打算发送 POST 请求或 GET 请求时调用 async_resolve。支持我的理论; Chat Client通过调用 async_connect 并使用 async_read 作为回调开始,这样他们就可以在客户端创建后安全地调用 io_service.run() 。我不想为了能够启动 io_service 而一直从服务器读取数据,因为这不是普通客户端的工作方式,对吗?如果用户没有导航到网站,浏览器不会从地球上所有可能的服务器读取数据...
如果我不使用示例 2 中的线程池,而是在单独的类中启动每个连接类,每个连接类都拥有自己的 io_service,则一切正常。但是,具有简单循环例程来选择合适的 io_service 的线程池似乎非常有吸引力。我使用多线程的最佳方法是什么?我是不是太挑剔了,应该坚持一个连接一个 io_service 的东西?
最佳答案
I have tried, as HTTP Server 2 example, to set up a thread pool of io_services and assigning work to them so that they will not return until stopped.
在使用异步编程时,我强烈建议按顺序使用以下设计:
io_service
io_service
的线程池io_service
每线程或其他奇特的设计只有在分析之后证明您当前的设计是瓶颈时,您才应该转向下一个设计。
BUT, from my own trial and error analysis, it seems as you cannot start io_service BEFORE you have issued an asynchronous function, is that true?
你是对的,io_service::run()
documentation说的很清楚
The run() function blocks until all work has finished and there are no more handlers to be dispatched, or until the io_service has been stopped.
防止 io_service::run()
立即返回的正确方法是排队一些处理程序,或实例化一个 io_service::work
object并在您希望 run()
保持事件状态时将其保持在范围内。
关于c++ - 启动 boost::asio::io_service 时的例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014644/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!