- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2015-03-03 16:37 编辑
www1862 发表于 2015-03-03 15:48 ![]()
协程的出现是为了什么?
在发生异步IO时,你要让出CPU,让别人干活。但是自己的过程要简洁,连贯,看起来像同步IO。- do {
- *buffer=0;
- r_len=AIO_read(fd,buffer,sizeof(buffer));
- if(r_len<=0) break;
- NetHead->PROTO_NUM=0;
- NetHead->data=buffer;
- NetHead->PKG_LEN=r_len;
- NetHead->ERRNO1=0;
- if(r_len==sizeof(buffer))
- NetHead->ERRNO2=PACK_CONTINUE;
- else
- NetHead->ERRNO2=0;
- li_ret=SendPack(connect,NetHead);
- if(li_ret) {
- ShowLog(1,"%s: SendPack2 ret=%d,err=%d,%s",__FUNCTION__,li_ret,
- errno,strerror(errno));
- close(fd);
- return -1;
- }
- } while(r_len==sizeof(buffer));
复制代码 这个程序你很容易看懂。是个发送文件的服务器端的应用插件。
注意3和13行,那是异步IO,线程会跑掉为别的客户端工作。
在没有AIO的时候,这个程序一工作,传文件,好几分钟,服务器不能响应其他任何请求。
在没有协程的时候,这个流程将被切割成:工作 放弃 测试完成否,继续循环。。。。非常凌乱。
还有,windoze:那个buffer是64K的局部变量。SendPack会压缩数据(如果没有足够的尺寸,压缩效果就不好),它要530多K的栈,这就600K左右了。你不给足够的栈不行的。
|
|