本文共 1904 字,大约阅读时间需要 6 分钟。
问题:协程如何使用?与线程使用有何区别?
在做网络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:int nty_coroutine_create(nty_coroutine **new_co, proc_coroutine func, void *arg)
void nty_schedule_run(void)
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/