greenlet是Python众多协程实现技术中的一种,eventlet是基于greenlet实现的。而eventlet和libev又是gevent的核心。greenlet的上下文切换清晰易懂,可以结合IO事件循环构建出一些高效的事件处理逻辑。不同于yield类型的上下文切换,greenlet的上下文切换从表现形式上看更纯粹,可以直接switch到另一个greenlet,不用管目标greenlet是否已经在运行,不同greenlet之间处于完全对等的状态,可以相互switch。基于yield实现的协程往往只能切换回自己的直接或间接调用者,要想在嵌套的调用中切换出去是比较麻烦的。本质上是因为yield只能保留栈顶的帧,Python3对
继续阅读 »
协程现在已经不是个新东西了,很多语言都提供了原生支持,也有很多开源的库也提供了协程支持。
最近为了要给tbox增加协程,特地研究了下各大开源协程库的实现,例如:libtask, libmill, boost, libco, libgo等等。
他们都属于stackfull协程,每个协程有完整的私有堆栈,里面的核心就是上下文切换(context),而stackless的协程,比较出名的有protothreads,这个比较另类,有兴趣的同学可以去看下源码,这里就不多说了。
那么现有协程库,是怎么去实现context切换的呢,目前主要有以下几种方式:
使用ucontext系列接口,例如:libtask
使用setjmp/longjm
继续阅读 »
简介
Benchbox是一个基准测试包,基于tbox和xmake,里面包含许多针对第三方库功能的性能基准测试和对比,可以很方便的扩展测试用例和模块。
目前内置:各大开源协程库性能基准测试,后续还会陆续增加各种开源库模块的分析测试
测试报告仅供参考,测试代码或者结果上如有问题,可以提交issues
编译
请先安装: xmake
然后运行:
bash
$ xmake
协程切换测试报告(2个协程)
Run
bash
$ xmake coroutine -n switch
Macosx (x86_64)
tbox: 10000000 switches in 205 ms, 4
继续阅读 »
此版本主要增加stackless协程模块以及为嵌入式平台增加micro微模块编译(~64K)。
此stackless协程模块比之前的stackfull协程实现更加的轻量高效,切换效率提升5、6倍,在macosx上测试1000w次切换仅需40ms
当然易用性和灵活性上,还是stackfull模式更有优势(tbox两种模式都已支持,接口类似)。
stackless协程使用见:stackless协程使用文档
stackfull协程使用见:stackfull协程使用文档
更多协程服务器demo实现,请参考:协程examples
新特性
针对协程上下文切换,支持mips架构
添加__tb_thread_local__关键字宏
添加
继续阅读 »
协程是用户态内的,或者准确点说是线程内部的一种上下文切换技术,由于协程切换是在用户态下完成的,所以省去了线程切换时频繁出入内核态的资源开销,可以形成一种很高效的协作式并发技术。
这个简短的视频介绍了一些有关协程、并发之类的东西,很有意义。
Coroutines, event loops, and the history of Python generators
从里面学习到两种很好的协程的调度方式。把代码拿过来分享一下。
Coroutine trampoline
这种方式下的协程调度比较好理解,就是从一个初始状态开始,一条执行线索不断的在多个协程之间切换,就好像多个协程协作完成一项任务。
代码:
def co_tramp
继续阅读 »
新特性
支持make进行直接编译(会去自动下载xmake进行构建)
在平台库中,添加切换context上下文接口(参考boost.context实现原理进行重写,并对部分架构进行优化)
新增跨平台协程模块(支持i386, x86_64, arm, arm64),提供更加易用的高性能并发编程模式
新增基于协程的各种服务器开发实例(包括:简单轻量的http服务器,爬虫。。)
新增poller轮询器接口,实现对epoll, poll, kqueue, select的封装,逐步取代老的aiop接口
新增mbedtls ssl库接口支持,目前已支持:openssl, polarssl, mbedtls
tbox所有stream, socke
继续阅读 »