c/c++ linux后台开发学习笔记 3.1.3 异步请求池的原理与实现

同步请求

while(...) {
	msg = prepare_msg(...);
	send(msg, ip);
	res = recv(...);
	process_res(res);
}

很明显,这样做效率低

异步请求

func callback(res) {
	process_res(res);
}
while(...) {
	msg = prepare_msg(...);
	send_async(msg, ip, callback);
}

这样就能发送异步请求,在请求返回时通过回调函数处理请求

异步请求池原理

上面唯一的问题是,我们的程序怎么知道请求返回了呢?
答案是通过epoll
发送请求后,把fd加入到epoll中,并把回调函数和epoll的事件绑定(event.data.ptr)
在另一个线程中调用epoll_wait专门处理请求的结果即可

实现

接口 (4个要素)
int  dns_async_context_init(struct async_context  *ctx);
int dns_async_send(struct async_context *ctx, char *msg, async_result_cb cb);
int dns_async_context_destroy();
void *dns_async_response_thread(void *arg);
数据结构

很简单,只有epfd和工作线程id

struct async_context {
   
	int epfd;
	pthread_t thid;
};
函数定义

首先是负责响应response的工作线程

void *dns_async_response_thread(void *arg) {
   

	/*
	 * while (1) {
 	 *    epoll_wait();
 	 *    recv();
 	 *    parse();
 	 *    fd --> epoll delete
	 * }
	 */

	struct async_context *ctx = (struct async_context *)arg;
	
 	while (1) {
   
		struct epoll_event events[ASYNC_CLIENT_NUM] = {
   0};
		
		int nready = epoll_wait(ctx->epfd, events, ASYNC_CLIENT_NUM, -1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值