结合Coroutine和Callback

Coroutine切换成本相对还是比较高的,把一个并发程序改成Coroutine实现性能上可能有比较大的损失。Coroutine切换主要是大量寄存器压栈和弹栈,栈切换也会影响到cache。目前C/C++大量使用的是回调方式,比如win32窗口编程、libevent等,优点是高效,函数调用成本是很低的,也没有栈切换,缺点是不如Coroutine这样连贯。有没有方法让它具有两者的优点呢?有Coroutine连贯的过程,也有Callback的高效?还是考虑这个简单的例子:

(本文代码使用D语法,但并没有编译测试)


void client_loop(int fd) {
while(true) {
register_read_event(fd);
wait_read_event();
char buf[1024];
int ret = recv(fd, buf.ptr, buf.length, 0);
if (ret <= 0) {
writefln("recv fail");
remove_events(fd);
close(fd);
break;
}
writefln("received:", buf[0..ret]);
}
}

void server_loop(int fd) {
while(true) {
register_read_event(fd);
wait_read_event();
int client = accept(fd);
spawn(client_loop, client);
}
}


假定它是以Coroutine方式来实现的,Coroutine这样来实现也是很简单的。对应的Callback是什么形式呢?我假想了一个:


void client_loop(int fd) {
register_read_event(fd)
.on_event({
char buf[1024];
int ret = recv(fd, buf.ptr, buf.length, 0);
if (ret <= 0) {
writefln("recv fail");
remove_events(fd);
close(fd);
}
else {
writefln("received:", buf[0..ret]);
client_loop(fd);
}
});
}

void server_loop(int fd) {
register_read_event(fd)
.on_event({
int clientfd = accept(fd);
client_loop(clientfd);
server_loop(fd);
});
}

注意这并不是递归,因为server_loop和client_loop是立即返回的,里面那个代码块只是closure。

这段代码可读性明显不如上面好,你必须时刻思考需要在哪里创建一个closure,只因为并发时需要切换,当然下面这个实现效率会好得多。有没有办法用Coroutine这种连贯的写法达到Callback这样的效率呢?这是最近想要研究的问题。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值