原理: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.