ZMQ之处理多个套接字(zmq_poll函数)
admin
2024-03-05 02:36:51
0

        在之前的示例中,主程序的循环体内会做以下几件事:

                1、等待套接字的消息。

                2、处理消息。

                3、返回第一步。

        如果我们想要读取多个套接字中的消息呢?最简单的方法是将套接字连接到多个端点上,让ZMQ使用公平队列的机制来接受消息。如果不同端点上的套接字类型是一致的,那可以使用这种方法。但是,如果一个套接字的类型是PULL,另一个是PUB怎么办?如果现在开始混用套接字类型,那将来就没有可靠性可言了。

        正确的方法应该是使用zmq_poll()函数。更好的方法是将zmq_poll()包装成一个框架,编写一个事件驱动的反应器,但这个就比较复杂了,我们这里暂不讨论。

        我们先不使用zmq_poll(),而用NOBLOCK(非阻塞)的方式来实现从多个套接字读取消息的功能。下面将气象信息服务和并行处理这两个示例结合起来:        

        msreader: Multiple socket reader in C

#include "zhelpers.h"int main (void) 
{//  准备上下文和套接字void *context = zmq_init (1);//  连接至任务分发器void *receiver = zmq_socket (context, ZMQ_PULL);zmq_connect (receiver, "tcp://localhost:5557");//  连接至天气服务void *subscriber = zmq_socket (context, ZMQ_SUB);zmq_connect (subscriber, "tcp://localhost:5556");zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "10001 ", 6);//  处理从两个套接字中接收到的消息//  这里我们会优先处理从任务分发器接收到的消息while (1) {//  处理等待中的任务int rc;for (rc = 0; !rc; ) {zmq_msg_t task;zmq_msg_init (&task);if ((rc = zmq_recv (receiver, &task, ZMQ_NOBLOCK)) == 0) {//  处理任务}zmq_msg_close (&task);}//  处理等待中的气象更新for (rc = 0; !rc; ) {zmq_msg_t update;zmq_msg_init (&update);if ((rc = zmq_recv (subscriber, &update, ZMQ_NOBLOCK)) == 0) {//  处理气象更新}zmq_msg_close (&update);}// 没有消息,等待1毫秒s_sleep (1);}//  程序不会运行到这里,但还是做正确的退出清理工作zmq_close (receiver);zmq_close (subscriber);zmq_term (context);return 0;
}

        这种方式的缺点之一是,在收到第一条消息之前会有1毫秒的延迟,这在高压力的程序中还是会构成问题的。此外,你还需要翻阅诸如nanosleep()的函数,不会造成循环次数的激增。

        示例中将任务分发器的优先级提升了,你可以做一个改进,轮流处理消息,正如ZMQ内部做的公平队列机制一样。

        下面,让我们看看如何用zmq_poll()来实现同样的功能:

        mspoller: Multiple socket poller in C

#include "zhelpers.h"int main (void) 
{void *context = zmq_init (1);//  连接任务分发器void *receiver = zmq_socket (context, ZMQ_PULL);zmq_connect (receiver, "tcp://localhost:5557");//  连接气象更新服务void *subscriber = zmq_socket (context, ZMQ_SUB);zmq_connect (subscriber, "tcp://localhost:5556");zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "10001 ", 6);//  初始化轮询对象zmq_pollitem_t items [] = {{ receiver, 0, ZMQ_POLLIN, 0 },{ subscriber, 0, ZMQ_POLLIN, 0 }};//  处理来自两个套接字的消息while (1) {zmq_msg_t message;zmq_poll (items, 2, -1);if (items [0].revents & ZMQ_POLLIN) {zmq_msg_init (&message);zmq_recv (receiver, &message, 0);//  处理任务zmq_msg_close (&message);}if (items [1].revents & ZMQ_POLLIN) {zmq_msg_init (&message);zmq_recv (subscriber, &message, 0);//  处理气象更新zmq_msg_close (&message);}}//  程序不会运行到这儿zmq_close (receiver);zmq_close (subscriber);zmq_term (context);return 0;
}

相关内容

热门资讯

天津港:2024年净利润同比增... 3月21日消息,天津港(600717)3月21日晚间披露年报,公司2024年实现营业收入120.7亿...
舍得酒业:2024年净利润3.... 3月21日消息,舍得酒业(600702)公告,2024年公司营业收入为53.57亿元,较上年同期减少...
吉林敖东:控股子公司获得聚乙烯... 3月21日消息,吉林敖东(000623.SZ)公告称,公司控股子公司吉林敖东药业集团延吉股份有限公司...
市场消息:韩国将从3月31日起... 3月21日消息,市场消息:韩国将从3月31日起按计划全面恢复股票卖空交易。
财政部:2024年对181家会... 3月21日消息,财政部今日发布财会监督检查公告,2024年,财政部组织各地财政厅(局)对2362家会...
GGII:2月国内动力电池装机... 3月21日消息,高工产业研究院(GGII)依据新能源汽车交强险口径数据统计显示,2月国内动力电池装机...
中国康富、华电国际在天津成立电... 3月21日消息,天眼查显示,近日,华豫二期(天津)电力能源合伙企业(有限合伙)成立,执行事务合伙人为...
港股汽车股持续回落,北京汽车跌... 3月21日消息,港股汽车股持续回落,截至发稿,北京汽车(01958.HK)跌12.40%、蔚来-SW...
港股午评:恒生指数跌2.01%... 3月21日消息,港股午间收盘,恒生指数跌2.01%,恒生科技指数跌2.94%。蜜雪集团跌超9%,金山...
美联邦法官裁决暂停政府效率部获... 3月21日消息,美国马里兰州联邦地区法院法官埃伦·霍兰德当地时间20日作出一项裁决,暂停政府效率部获...