003 ZeroMQ PUSH and POLL
来源:互联网 发布:人才市场管理系统java 编辑:程序博客网 时间:2024/05/22 04:40
原理:taskVent分发任务,worker工作,collect收集结果
框架:
实践part1:
实践part2:
以下是代码:
code:taskvent.cpp
#include<zmq.h>#include<iostream>#include<thread>#include<chrono>using std::cout;using std::endl;int main(){ void* pContext = zmq_ctx_new(); void* pPushSocket = zmq_socket(pContext, ZMQ_PUSH); zmq_bind(pPushSocket, "tcp://*:5601"); void* pPushToCollectSocket = zmq_socket(pContext, ZMQ_PUSH); zmq_connect(pPushToCollectSocket, "tcp://localhost:5602"); cout << "tell collector to ready..." << endl; zmq_msg_t msgToCollect; zmq_msg_init(&msgToCollect); zmq_msg_send(&msgToCollect, pPushToCollectSocket, 0); zmq_msg_close(&msgToCollect); cout << "press Enter when workers are all running" << endl; getchar(); cout << "start vent 100 tasks..." << endl; for (int i = 0; i < 100;++i) { char buffer[32]; memset(buffer, 0, sizeof(buffer)); sprintf_s(buffer, "task item %d", i); zmq_msg_t msgToWorker; zmq_msg_init_size(&msgToWorker, sizeof(buffer)); memcpy(zmq_msg_data(&msgToWorker), buffer, sizeof(buffer)); zmq_msg_send(&msgToWorker, pPushSocket, 0); zmq_msg_close(&msgToWorker); } std::this_thread::sleep_for(std::chrono::milliseconds(1200)); cout << "task vent complete,press Enter to exit" << endl; getchar(); zmq_close(pPushSocket); zmq_close(pPushToCollectSocket); zmq_ctx_destroy(pContext); return 0;}
code:worker.cpp
#include<zmq.h>#include<iostream>#include<thread>#include<chrono>#include<string>using std::cout;using std::endl;int main(){ void* pContext = zmq_ctx_new(); void* pPullSocket = zmq_socket(pContext, ZMQ_PULL); zmq_connect(pPullSocket, "tcp://localhost:5601"); //用于接收任务; void* pPushSocket = zmq_socket(pContext, ZMQ_PUSH); zmq_connect(pPushSocket, "tcp://localhost:5602"); //用于发送结果; char buffer[32]; memset(buffer, 0, sizeof(buffer)); while (true) { cout << "listen..." << endl; zmq_msg_t msgIn; zmq_msg_init(&msgIn); zmq_msg_recv(&msgIn, pPullSocket, 0); cout << "work task is:" << (char*)zmq_msg_data(&msgIn); memcpy(buffer, zmq_msg_data(&msgIn), zmq_msg_size(&msgIn)); zmq_msg_close(&msgIn); //do some work std::this_thread::sleep_for(std::chrono::milliseconds(1200)); cout << "-----done" << endl; //report result zmq_msg_t msgOut; zmq_msg_init_size(&msgOut, sizeof(buffer)); memcpy(zmq_msg_data(&msgOut), buffer, sizeof(buffer)); zmq_msg_send(&msgOut, pPushSocket, 0); zmq_msg_close(&msgOut); } zmq_close(pPullSocket); zmq_close(pPushSocket); zmq_ctx_destroy(pContext); return 0;}
code:collect.cpp
#include<zmq.h>#include<iostream>#include<thread>#include<chrono>using std::cout;using std::endl;int main(){ void* pContext = zmq_ctx_new(); void* pPullSocket = zmq_socket(pContext, ZMQ_PULL); zmq_bind(pPullSocket, "tcp://*:5602"); cout << "receiving ready signal" << endl; zmq_msg_t msgReady; zmq_msg_init(&msgReady); zmq_msg_recv(&msgReady, pPullSocket, 0); zmq_msg_close(&msgReady); cout << "done!" << endl; cout << "start collect..." << endl; int i; for (i = 0; i < 100;++i) { zmq_msg_t msgIn; zmq_msg_init(&msgIn); zmq_msg_recv(&msgIn, pPullSocket, 0); cout << "[" << (char*)zmq_msg_data(&msgIn) << "]---" << i << endl; zmq_msg_close(&msgIn); } if (i==100) { cout << "all done,press Enter to exit" << endl; } getchar(); zmq_close(pPullSocket); zmq_ctx_term(pContext); return 0;}
//share end.
0 0
- 003 ZeroMQ PUSH and POLL
- zeromq push-pull 模式
- poll push 设计模式
- ZeroMQ之push/pull模式
- ZeroMQ之PUSH/PULL模式
- ZeroMQ之push/pull模式
- zeromq and jzmq
- zeromq and redis comparsion
- ZeroMQ(java)之push/pull模式
- ZeroMQ(java)之Push/Pull模式
- ZeroMQ(java)之Push/Pull模式
- 001 ZeroMQ server and client
- 002 ZeroMQ PUB and SUB
- Poll and Epoll
- zeroMQ初体验-3.分而治之模式(push/pull)
- zeromq/jzmq push/pull模式及java代码
- GitHun create and push
- zeromq
- 音视频基本概念
- 函数模板返回两个值的最小值,确保能正确处理字符串
- 红黑树R-B-tree
- 自动化测试常用断言的使用方法(python)
- POJ3621 Sightseeing Cows
- 003 ZeroMQ PUSH and POLL
- 创建链表
- jvm memory
- 剑指offer-面试题27:二叉搜索树与双向链
- 求阶乘
- MySQL 主从复制与读写分离概念及架构分析
- ubuntu 新手入门
- UVA Live 6437 Power Plant 最小生成树
- 1007. 素数对猜想 (20)——做题纪录