目前有个后端worker用的python 2.7写的,一次起10个gen.coroutine来跑黑盒的代码,这些代码很多是在做HTTP request。
在server端发现这些来自worker的lantency特别长。一番查找发现是http request的receive时间特别长,一般发4ms延迟,但是用这个就是40ms+。
做了一些测试后,定位为gen.coroutine跑代码的坑。
YY的原因:http基于tcp/ip,所以也有若干个回合的通信,一般发request,线程阻塞就挂起,收到就抢占读然后接着下一个包。
Python是单线程,coroutine所以是伪多协程,cpu调度里怀疑是严格的时间片轮转,即使一个coroutine已经被io阻塞了,依然占用cpu,不释放。所以10个协程,在轮询执行过程中,即使有的io已经可读,因为不能用cpu,所以被强行等待,也就是每一轮的通信都被延迟了。所以导致了这个问题。
简单看了下python3里的coroutine,可以做到挂起协程,用await的方法。
但是我们这个有一些特殊性,不能知道用户写的到底是啥,估计这个方法也不一定ok。另外也打算deprecate掉python,所以也不花时间改进了。
网友评论