版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011734144/article/details/84334536
代码逻辑:
def getInlink()
A -> B -> C -> D
在tornado中调用getInlink
@tornado.gen.coroutine
def get(self):
start2 = int(time.time()*1000)
error, errReason, lstSummary = yield self.getInlink(utfQuery)
print 'total use %d' % (int(time.time()*1000)-start2)
实践中,分别记录了上面四个步骤执行的时间, 假设为At, Bt, Ct, Dt,并且记录了getInlink总的时间,假设为ADt(调用getInlink方法到返回的时间)
发现4个代码片段的时间的和不等于总的时间, 也就是:
ADt > At+Bt+Ct+Dt
原因是什么呢?
之前分析过的错误的原因:
A->D这个步骤中应该还有CPU调度的等待时间,这段代码并不是一直都在执行
尤其,这4步如果有IO的话,假设B中有IO,那么在B执行IO的过程中,该进程会被挂起,而当IO执行完后,也不一定马上就可以被CPU调度执行,很可能还要等待一段时间
正确的原因:
其实上面分析的原因不对,因为B中的IO虽然会等待被调度,但是Bt的时间其实已经包含了那段等待被调用的时间了
真实的原因应该是调用getInlink方法用了yield,所以它所在的get方法就变成了迭代器,这个方法需要等待被tornado的空闲的线程来调用,所以应该是:
ADt = At+Bt+Ct+Dt + getInlink方法等待被执行的时间