博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux高性能网络:协程系列03-协程的案例
阅读量:3511 次
发布时间:2019-05-20

本文共 1904 字,大约阅读时间需要 6 分钟。

目录

3.协程的案例

  问题:协程如何使用?与线程使用有何区别?

  在做网络IO编程的时候,有一个非常理想的情况,就是每次accept返回的时候,就为新来的客户端分配一个线程,这样一个客户端对应一个线程。就不会有多个线程共用一个sockfd。每请求每线程的方式,并且代码逻辑非常易读。但是这只是理想,线程创建代价,调度代价就呵呵了。

先来看一下每请求每线程的代码如下:

while (1) {    int nfds = epoll_wait(epoll_fd, events, curfds, -1);    if (nfds == -1) {        perror("epoll_wait");        break;    }    for (i = 0;i < nfds;i ++) {        int sockfd = listenfd(events[i].data.fd, sockfds);        if (sockfd) {            socklen_t len = sizeof(struct sockaddr_in);            int clientfd = accept(sockfd, (struct sockaddr*)&remote, &len);            pthread_t thread_id;            pthread_create(&thread_id, NULL, client_cb, &clientfd);        }        else        {            ...        }}

  这样的做法,写完放到生产环境下面,如果你的老板不打死你,你来找我。我来帮你老板,为民除害。

  如果我们有协程,我们就可以这样实现。参考代码如下:
  

while (1) {    int nfds = epoll_wait(epoll_fd, events, curfds, -1);    if (nfds == -1) {        perror("epoll_wait");        break;    }    for (i = 0;i < nfds;i ++) {        int sockfd = listenfd(events[i].data.fd, sockfds);        if (sockfd) {            socklen_t len = sizeof(struct sockaddr_in);            int clientfd = accept(sockfd, (struct sockaddr*)&remote, &len);                        nty_coroutine *read_co;            nty_coroutine_create(&read_co, server_reader, &clientfd);        }        else        {            ...        }}

  这样的代码是完全可以放在生成环境下面的。如果你的老板要打死你,你来找我,我帮你把你老板打死,为民除害。

  线程的API思维来使用协程,函数调用的性能来测试协程。
  NtyCo封装出来了若干接口,一类是协程本身的,二类是posix的异步封装
  协程API:

  1. 协程创建
int nty_coroutine_create(nty_coroutine **new_co, proc_coroutine func, void *arg)
  1. 协程调度器的运行
void nty_schedule_run(void)
  1. POSIX异步封装API:
int nty_socket(int domain, int type, int protocol)int nty_accept(int fd, struct sockaddr *addr, socklen_t *len)int nty_recv(int fd, void *buf, int length)int nty_send(int fd, const void *buf, int length)int nty_close(int fd)

接口格式与POSIX标准的函数定义一致。

更多分享

email:

email:
email:
协程技术交流群:829348971

转载地址:http://apfqj.baihongyu.com/

你可能感兴趣的文章
SpringBoot入门--自动配置
查看>>
springboot读取配置文件 例:读取配置文件的优先顺序;在主配置文件中激活其他配置文件;加载非主配置文件
查看>>
自动配置原理
查看>>
TCP协议
查看>>
关于Linux系统使用遇到的问题-1:vi 打开只读(readonly)文件如何退出保存?
查看>>
redis 持久化详解,RDB和AOF是什么?他们优缺点是什么?运行流程是什么?
查看>>
spring注解版(一)
查看>>
SpringBoot中访问控制层(controller)得不到Json数据
查看>>
react项目报出警告Warning: Cannot update during an existing state transition (such as within `render`).
查看>>
BFC(Block Formatting Context)
查看>>
什么是作用域,什么是闭包,什么是作用域链
查看>>
惰性求值,面向对象
查看>>
lodash源码分析之baseSlice()函数
查看>>
数据结构之列表
查看>>
发布/订阅模式 vs 观察者模式
查看>>
es5中的arguments对象
查看>>
git本地仓库和远程仓库关联,分支重命名
查看>>
js对象的深拷贝,你真的觉得很简单吗?
查看>>
你真的了解map方法吗?手动实现数组map方法。
查看>>
带你手动实现call方法,让你收获满满
查看>>