日志中每段代码执行时间的和不等于整段代码执行的总时间

版权声明:本文为博主原创文章,未经博主允许不得转载。 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方法等待被执行的时间

猜你喜欢

转载自blog.csdn.net/u011734144/article/details/84334536
今日推荐