2017-09-17 47 views
0

當我看到龍捲風的源代碼,我想記錄每個socket接受的時間,所以我就accept_handler添加日誌是這樣的:如何登錄龍捲風插座接受時間?

def accept_handler(fd, events): 
    for i in xrange(_DEFAULT_BACKLOG): 
     if removed[0]: 
      # The socket was probably closed 
      return 
     try: 
      connection, address = sock.accept() 
     except socket.error as e: 
      # _ERRNO_WOULDBLOCK indicate we have accepted every 
      # connection that is available. 
      if errno_from_exception(e) in _ERRNO_WOULDBLOCK: 
       return 
      # ECONNABORTED indicates that there was a connection 
      # but it was closed while still in the accept queue. 
      # (observed on FreeBSD). 
      if errno_from_exception(e) == errno.ECONNABORTED: 
       continue 
      raise 
     set_close_exec(connection.fileno()) 
     gen_log.warning('accept at {}'.format(io_loop.time())) 
     callback(connection, address) 

我的處理程序是一個阻塞函數,它阻止ioloop 3S和回報「你好世界'。

然後我送10個請求通過線程同時,我發現龍捲風日誌是這樣的:

[W 170916 22:06:01 netutil:278] accept at 1505624761.04 
sleep at 1505624761.04 
wake at 1505624764.04 
[I 170916 22:06:04 web:2063] 200 GET/(192.168.10.243) 3005.47ms 
[W 170916 22:06:04 netutil:278] accept at 1505624764.04 
sleep at 1505624764.04 
wake at 1505624767.05 
[I 170916 22:06:07 web:2063] 200 GET/(192.168.10.243) 3005.02ms 
[W 170916 22:06:07 netutil:278] accept at 1505624767.05 
sleep at 1505624767.05 
wake at 1505624770.05 
[I 170916 22:11:06 web:2063] 200 GET/(192.168.10.243) 3003.87ms 
[W 170916 22:11:06 netutil:278] accept at 1505625066.86 
sleep at 1505625066.86 
wake at 1505625069.86 
[I 170916 22:11:09 web:2063] 200 GET/(192.168.10.243) 3002.22ms 
[W 170916 22:11:09 netutil:278] accept at 1505625069.86 
sleep at 1505625069.86 
wake at 1505625072.87 
[I 170916 22:11:12 web:2063] 200 GET/(192.168.10.243) 3004.91ms 
[W 170916 22:11:12 netutil:278] accept at 1505625072.87 
sleep at 1505625072.87 
wake at 1505625075.87 
[I 170916 22:11:15 web:2063] 200 GET/(192.168.10.243) 3004.71ms 
[W 170916 22:11:15 netutil:278] accept at 1505625075.87 
sleep at 1505625075.87 
wake at 1505625078.88 
[I 170916 22:11:18 web:2063] 200 GET/(192.168.10.243) 3006.12ms 
[W 170916 22:11:18 netutil:278] accept at 1505625078.88 
sleep at 1505625078.88 
wake at 1505625081.89 
[I 170916 22:11:21 web:2063] 200 GET/(192.168.10.243) 3006.07ms 
[W 170916 22:11:21 netutil:278] accept at 1505625081.89 
sleep at 1505625081.89 
wake at 1505625084.89 
[I 170916 22:11:24 web:2063] 200 GET/(192.168.10.243) 3005.07ms 
[W 170916 22:11:24 netutil:278] accept at 1505625084.9 
sleep at 1505625084.9 
wake at 1505625087.9 
[I 170916 22:11:27 web:2063] 200 GET/(192.168.10.243) 3006.34ms 

它看起來像龍捲風進程請求一個接一個,但我認爲這是不正確的,我用wireshark查找所有連接在很短的時間內被接受,所以我不知道如何添加日誌來顯示每個socket接受時間。

回答

0

在龍捲風中,阻擋處理程序阻止的一切。這包括,在這種情況下,下一個呼叫accept()(在接受循環結束時呼叫callback()將最終到達處理程序)。要在Tornado中實現任何併發性,必須使所有處理程序都是非阻塞的(在IOLoop線程上)。可以使用ThreadPoolExecutor將工作移動到其他線程,並且在這些線程中可以儘可能多地阻塞,但是您可以' t調用其他Tornado方法)。

0

我想爲什麼我會問這個問題的原因是來自我對socket的誤解。

當我讀到tornado源代碼,我認爲服務器調用sock.accept,連接轉向狀態ESTABLISHED後,這不是真的,連我自己都不啓動ioloop,客戶端可以連接到服務器和這些插座可以,除非達到建立默認聽backlog(128)