【发布时间】:2012-10-01 11:52:13
【问题描述】:
我有一个使用 ZeroMQ 进行消息传递的 C++ 应用程序。但它还必须为基于 AJAX / Comet 的 Web 服务提供 SGCI 连接。
为此,我需要一个普通的 TCP 套接字。我可以通过普通的 Posix 套接字来做到这一点,但为了保持跨平台的便携性并让我的生活更轻松(我希望......)我正在考虑使用 Boost::ASIO。
但是现在我遇到了 ZMQ 想要使用它自己的 zmq_poll() 和 ASIO 的冲突 io_service.run()...
有没有办法让 ASIO 与 0MQ zmq_poll() 一起工作?
或者是否有其他推荐的方法来实现这样的设置?
注意:我可以通过使用多个线程来解决这个问题 - 但它只是一个小的单核/CPU 机器,它会以非常低的 SCGI 流量运行该程序,所以多线程会浪费资源......
【问题讨论】:
-
对于我们这些不熟悉 ZeroMQ 的人,你能扩展一下 zmq_poll() 吗?我认为这是某种事件循环?
-
是的,
zmq_poll()基本上是一个事件循环。它可以同时等待 ZMQ 套接字和本机套接字(由它们的文件描述符整数 id 给出)(参见api.zeromq.org/3-2:zmq-poll)。由于它是 C API,因此无法进行更深层次或 C++ 的扩展方式。 -
zmq_poll() 不等待也不阻塞。这就是轮询它而不是仅仅调用 sockets.recv() (它将阻塞直到收到消息)
-
zguide.zeromq.org/page:all#Handling-Multiple-Sockets zmq 投票示例(检查第二个“代码块”)。从 zmq_poll 文档中,将 zmq_poll() 的超时设置为 0 使其立即返回
-
“多线程会浪费资源”——基于什么?它是单核 CPU 的事实对于多线程来说不是问题,尤其是当线程几乎没有任何工作要做时。如果您的可用内存量受到极大限制(例如,对于嵌入式解决方案),资源浪费将令人担忧,但您并没有说是这种情况。
标签: c++ sockets boost boost-asio zeromq