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;
}

相关内容

热门资讯

交通运输部:加快内河新能源清洁... 8月21日,交通运输部党组书记、部长刘伟主持召开部务会。会议强调,要做好完善现代化都市圈综合交通运输...
中央网络安全和信息化委员会:引... 8月21日,中央网络安全和信息化委员会近日印发《促进网信企业高质量发展行动计划(2026-2030年...
渤海银行及旗下渤银理财合计被罚... 文/每日财报 侯夏雪8 月 21 日晚,国家金融监督管理总局官网公布行政处罚信息公示列表,对渤海银行...
茅台业绩会回应多个热点:业绩阶... 贵州茅台管理层最新回应逆势调价、上半年增收不增利、社会渠道库存、市场化改革成效、茅台酒产量等多个投资...
蓝思科技:上半年归母净利润5.... 新京报贝壳财经讯 8月21日,蓝思科技公告,2026年上半年营业收入288.66亿元,同比下降12....
东北证券:上半年归母净利润7.... 新京报贝壳财经讯 8月21日,东北证券公告,2026年上半年营业总收入26.47亿元,同比增长29....
“属相”影响去留?民生人寿陷裁... 据《金融一线》消息,近期社交平台出现多条关于民生人寿人员调整的消息,有员工称,因生肖属蛇被通知离职,...
贝壳上半年净利润38.79亿元... 新京报贝壳财经讯 (记者段文平)8月21日,贝壳发布2026年第二季度以及半年度业绩公告。公告显示,...
许家印无期!两个儿子有期,前妻... 来源:易简财经 法槌落下,一个时代彻底终结。 8月20日,广东省深圳市中级人民法院一审公开宣判: 对...
上交所本周对爱丽家居等严重异常... 8月21日,上交所本周对111起拉抬打压、虚假申报等证券异常交易行为采取了自律监管措施,对爱丽家居等...