2016-07-08 53 views
0

我有以下的「虛擬服務器」運行:Tornado併發限於6個連接?

import tornado.web 
from tornado.ioloop import IOLoop 
from tornado import gen 
import time 

@gen.coroutine 
def async_sleep(seconds): 
    yield gen.Task(IOLoop.instance().add_timeout, time.time() + seconds) 

class TestHandler(tornado.web.RequestHandler): 

    reqnum = 0 

    @gen.coroutine 
    def get(self): 
     reqnum = TestHandler.reqnum 
     TestHandler.reqnum += 1 
     for i in range(100): 
      print(reqnum,end='') 
      if reqnum == 0 : print() 
      yield async_sleep(1) 
     self.write(str(reqnum)) 
     self.finish() 

if __name__ == '__main__' : 

    application = tornado.web.Application([ 
     (r"/test", TestHandler), 
     ]) 

    application.listen(9999) 
    IOLoop.instance().start() 

所以這應該運行罰款噸併發連接,你會覺得......但事實並非如此。啓動服務器並打開16個選項卡,它會得到:

0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 
120 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 
314520 

這很令人困惑。更令人沮喪的是,正確的結果會打印在所有標籤上,0-15。這是所有輸出到控制檯,但。沒有更多到達。

這是怎麼回事?

回答

2

我認爲這是兩件事情的組合:

  1. 瀏覽器被限制到服務器(see the FAQ)連接的數量。如果您在一個瀏覽器中使用單獨的瀏覽器而不僅僅是選項卡,則應該會看到更多連接。

  2. Python的標準輸出是行緩衝的,所以輸出僅在有換行符時寫入控制檯。一旦請求0完成,你不再寫新行,所以其他的東西都被保存在緩衝區中。