1
neoblackcap 2015-02-09 23:30:41 +08:00
最佳实践请参考Torndo源码
|
2
mengzhuo 2015-02-09 23:54:51 +08:00
简单的说,没有办法
因为epoll不是银弹,异步仅仅适用于IO密集 工作中碰到CPU密集一般是规避计算、减少内存分配(减少function call、memoryview+zero copy黑科技、更改算法数据结构的、甚至是改通讯协议) 实在没办法避免的话,一般用多进程处理,或者用延后处理库:celery 恰好最近仿照Tornado,写了一个ioloop(你可以看成是Tornado的核心部分) https://github.com/mengzhuo/ioloop |
3
puncsky 2015-02-10 02:24:52 +08:00
我觉得你的理解是对的,楼上说的对,仅仅适用于IO密集,因为能够解除 thread-per-connection 的关系,变成 event-driven。这叫做 reactor pattern。
如果 event loop 也变成 async 的,那就是 proactor pattern. http://www.puncsky.com/blog/2015/01/13/understanding-reactor-pattern-for-highly-scalable-i-o-bound-web-server/ |
4
est 2015-02-10 08:59:31 +08:00
> 在第39行,如果有个task需要执行1000s,那么这个时候进程就会阻塞在这里,其他客户得不到响应
这得看1000s阻塞的是什么东西,假如这1000s是也在等待其他IO,那么聪明一点的调度器会把纤程拿过来继续下一次epoll。 假如这1000s是把你8个核心跑满的计算小数点后100000000000000000位的Pi,那么神仙都没办法,只能大家一起等了。 |
5
veezzz 2015-02-12 10:30:57 +08:00
嗯,之前问过相关的问题,epoll只是IO的多路复用,我的理解是相当于一次性注册多个IO事件,然后让epoll去批量处理,但是epoll等待IO事件的时候会阻塞,不过可以设置让它马上返回,或者在一定时间内,至少有一个事件后返回 /t/159115
|