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
原创粉丝点击