背景
今天谈谈比较热门的协程框架libgo, 其实和腾讯微信后台的协程库libco相比,libgo的性能大大超过libco,下图是从协程的各个角度相比。
源码
libgo源码
https://github.com/yyzybb537/libgo
或
https://gitee.com/yyzybb537/libgo
llibgo的目录结构说明:
w@w:~/wz/libgo/libgo$ ls -l
total 52
drwx------ 2 w w 4096 4月 24 21:06 cls
drwx------ 2 w w 4096 5月 10 22:13 common
drwx------ 3 w w 4096 4月 24 21:06 context
-rwx------ 1 w w 1918 4月 24 21:03 coroutine.h
drwx------ 2 w w 4096 4月 24 21:06 debug
drwx------ 2 w w 4096 4月 24 21:06 defer
-rwx------ 1 w w 38 4月 24 21:03 libgo.h
drwx------ 5 w w 4096 4月 24 21:06 netio
drwx------ 2 w w 4096 4月 24 21:06 pool
drwx------ 2 w w 4096 4月 24 21:06 scheduler
drwx------ 2 w w 4096 4月 24 21:06 sync
drwx------ 2 w w 4096 4月 24 21:06 task
drwx------ 2 w w 4096 4月 24 21:06 timer
libgo 做的较好的一点是增加了对windows 环境的支持等,我们只针对 Linux 环境做研究。
TODO:libgo 后续会逐步完善或增加的功能;
libgo:源码实现的主目录,关于协程和调度策略的实现都在该目录下;
test:测试代码;
tutorial:libgo 使用教程代码;
vs_proj:VS 环境下如何使用libgo。
在libgo目录下
task:协程的相关实现;
scheduler:协程调度的实现;
debug:libgo 自带的调试功能(用于协程状态的定位等);
coroutine.h:对一些常用对方法进行了重定义。
netio:hook的系统调用;
context:上下文的切换;
pool:libgo 实现的连接池
除此之外,libgo对linux的系统调用导致的阻塞都重新进行封装,Linux系统上Hook的系统调用列表:
connect
read
readv
recv
recvfrom
recvmsg
write
writev
send
sendto
sendmsg
poll
select
accept
sleep
usleep
nanosleep
gethostbyname
gethostbyname2
gethostbyname_r
gethostbyname2_r
gethostbyaddr
gethostbyaddr_r
以上系统调用都是可能阻塞的系统调用, 在协程中使用均不再阻塞整个线程, 阻塞等待期间CPU可以切换到其他协程执行.
close
fcntl
ioctl
getsockopt
setsockopt
dup
dup2
dup3
以上系统调用不会造成阻塞, 虽然也被Hook, 但并不会完全改变其行为, 仅用于跟踪socket的选项和状态.
参考:
https://blog.51cto.com/muhuizz/2328117