Asynchronous Input/Output(AIO):AIO可以在input/output的請(qǐng)求到來之前繼續(xù)執(zhí)行。AIO在實(shí)時(shí)應(yīng)用程序中是必須的。使用AIO可以映射多個(gè)任務(wù)到一個(gè)線程上去。
首先zeromq的設(shè)計(jì)是弱中間人的(brokerless,相對(duì)于ActiveMQ、RabbitMQ等,使用0zq的程序就可以直接和其他的節(jié)點(diǎn)通信而不通過broker的代理。),zeromq不會(huì)存儲(chǔ)信息到磁盤上,然而可能使用本地的交換文件來存儲(chǔ)消息(當(dāng)設(shè)置了zmq.SWAP時(shí))。
示例:HelloWorld(server)

server
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <zmq.h>
int main(int argc, char *argv[])
{
void *context = zmq_ctx_new();
void *respond = zmq_socket(context, ZMQ_REQ);
zmq_bind(respond, "tcp://*:4040");
printf("starting
\n");
for (;;)
{
zmq_msg_t request;
zmq_msg_init(&request);
zmq_msg_recv(&request, respond, 0);
printf("received: %s\n", zmq_msg_data(&request));
zmq_msg_close(&request);
sleep(1);
zmq_msg_t reply;
zmq_msg_init_size(&reply, strlen("world"));
memcpy(zmq_msg_data(&reply), "world", 5);
zmq_msg_send(&reply, respond, 0);
zmq_msg_close(&reply);
}
zmq_close(respond);
zmq_ctx_destroy(context);
return 0;
示例:Helloworld(client)

client
1
2 #include <stdio.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <zmq.h>
6
7 int main(int argc, char *argv[])
8 {
9 void *context = zmq_ctx_new();
10 printf("client starting
\n");
11
12 void *request = zmq_socket(context, ZMQ_REQ);
13 zmq_connect(request, "tcp://localhost:4040");
14
15 int count = 0;
16
17 for (;;)
18 {
19 zmq_msg_t req;
20 zmq_msg_init_size(&req, strlen("hello"));
21 memcpy(zmq_msg_data(&req), "hello", 5);
22 printf("send msg hello, count = %d\n", count);
23 zmq_msg_send(&req, request, 0);
24 zmq_msg_close(&req);
25
26 zmq_msg_t reply;
27 zmq_msg_init(&reply);
28 zmq_msg_recv(&reply, request, 0);
29 printf("recv msg %s, count = %d\n", zmq_msg_data(&reply), count);
30 zmq_msg_close(&reply);
31 count++;
32 }
33
34 zmq_close(request);
35 zmq_ctx_destroy(context);
36
37 return 0;
38 }
39
40 這里使用了最基本的請(qǐng)求應(yīng)答架構(gòu)。詳細(xì)解析代碼:
第一步:創(chuàng)建了context和socket,zmq_ctx_new方法創(chuàng)建了一個(gè)新的
context,這是線程安全的,即一個(gè)context可用于多個(gè)線程操作。 zmq_socket方法創(chuàng)建了一個(gè)在context中定義的socket,
ZeroMQ的socket不是線程安全。傳統(tǒng)的socket是同步的,然而ZMQ的socket在客戶端和服務(wù)端都維護(hù)了一個(gè)隊(duì)列來管理request-reply的異步模式。ZMQ自動(dòng)的處理連接、重連、斷開連接和內(nèi)容交付。
服務(wù)端創(chuàng)建了Reply(ZMQ_REP)用來處理接收消息并應(yīng)答消息。如果客戶端和服務(wù)端遺失(lost),應(yīng)答的消息將在沒有任何通知的情況下丟掉。
客戶端創(chuàng)建了一個(gè)Request(ZMQ_REQ)來發(fā)送消息并接收來自服務(wù)的應(yīng)答。ZMQ_REQ下不會(huì)丟棄任何信息,不管是沒有沒有可用與發(fā)送消息的服務(wù)或是服務(wù)處于忙狀態(tài),所有的發(fā)送操作zmq_send函數(shù)會(huì)阻塞,直到一個(gè)服務(wù)變?yōu)榭捎糜诎l(fā)送消息。ZMQ_REQ和ZMQ_REP、ZMQ_ROUTER類型兼容。
消息的發(fā)送zmq_send函數(shù)的第三個(gè)參數(shù)是flags,是ZMQ_DONTWAIT或ZMQ_SNDMORE。ZMQ_DONTWAIT表明消息是異步的發(fā)送。ZMQ_SNDMORE表明消息有多部分,其余的部分已經(jīng)“在路上了”。消息接收函數(shù)zmq_msg_recv函數(shù),如服務(wù)端,在先前接收的消息是無效的。第三個(gè)參數(shù)flugs可能是ZMQ_DONTWAIT。
先睡覺了