上周末的CPyUG上海python聚会, 沈游侠又一次show了他的eurasia框架. 之后javaeye的robbin写博讨论, 然后被nicholasdsj在twitter上发问... 看起来超级热闹.
对于eurasia是不是有那么高的性能, 考虑到沈游侠在娱乐界的地位, 我也不敢随便评价. 总之希望明天会更好, 这也是我们写程序的每个人的美好愿景.
更大的收获还在于对问题的思考, 进程, 线程和协程, 本来就是完全不同的概念, 如今被混在了一起.
进程, 线程是操作系统的概念, 一个多任务操作系统必然有多进程. 线程是可选的, 好处是不同线程可以在进程内共享内存. 教科书都是这么介绍的, 只要操作系统不是那么老掉牙(DOS), 进程们可以同时运行啦.
但是不能忽略的事实是, 单核CPU在同一时间内只能执行一个指令, 那为什么说多任务呢? 仔细一想, 什么进程和线程只不过是CPU按照时间分配而已, 都是些内核玩的把戏.
那么, 按照时间分配是否适合服务器程序呢? 数据在到达网卡之前, 疯狂进程和线程切换只能是两个字: 白干. 不过, 想去掉进程这种玩意, 其他的服务你跑啦? mysql不用啦?
老老实实放弃线程, 或者换一种说法, 放弃系统提供的按照时间切换的线程, 实现自己线程.
OK, 就此打住, 我们再来看看协程
协程的定义可以查看高纳德的 The Art of Computer Programming 或者
维基百科, 与协程相对的定义是子例程(应该就是子程序, 好经典的词汇, 让我们回到函数之前的年代)
(这里强调, 协程只是相对于子程序的一种编程概念, 但是到了stackless python中, 却变成了一种替代线程的产品了.)
说白了协程可以自己控制子程序(或者更加现代的说法: 函数)间的切换, 而不像 POSIX pthread 那样按照时间切换. 话说因为GIL的关系, Python的线程确实不敢恭维.
这样说来, 采用stackless python的eurasia的确可以省掉不少CPU资源, 单线程且没有加锁需求.
思路很对.
还有什么可以突破的?
poll和intrrupt模式, 用中文讲就是轮询和中断.
socket的一个相当通用的编程模式就是poll, 就是轮询, 显然不是什么高效的模式. 采用中断模式来驱动协程之间的切换一定会有助于性能的提高. epoll或者IOCP, 应该是已经被验证了的, 有效提高服务器效率的方式.
eurasia如果放在stackless+twisted上, 一定会增色不少.
post on 2009-08-12 21:34