簡體   English   中英

龍卷風並發限於6個連接?

[英]Tornado concurrency limited to 6 connections?

我正在運行以下“虛擬服務器”:

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)。 這就是控制台的所有輸出。 沒有更多的到達。

到底發生了什么?

我認為這是兩件事的結合:

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

  2. Python的stdout是行緩沖的,因此僅在有換行符時才將輸出寫入控制台。 請求0完成后,您將不再編寫換行符,因此其他所有內容都將保留在緩沖區中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM