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