2017-09-14 41 views
0

我已經閱讀了龍捲風ioloop和相關模塊,以瞭解當套接字被接受並且請求被解析和處理時龍捲風會做什麼。龍捲風在處理處理程序時如何處理遠程關閉連接?

我想知道在請求連接關閉後龍捲風是否可以停止請求處理?


我建立一個測試處理機,所述get方法花費5秒睡眠(time.sleeo(5))。

然後我發送一些龍捲風的請求,所有的請求都設置爲讀取超時3秒,我在龍捲風和幾分鐘後發現了一些close_wait連接,這些連接正常關閉。

我猜5秒處理程序是減慢龍捲風的事件循環,當龍捲風處理第二個處理程序,其連接已關閉,如果龍捲風知道,它不需要做下一步。

回答

0
  1. 請勿在Tornado應用程序中使用time.sleep();爲什麼請參閱this question

  2. 當您的處理程序的耗時部分是非阻塞時,您可以定義一個方法on_connection_close(),該方法將在連接關閉時調用。從這種方法你可以取消正在進行的工作。您必須自己實施取消操作,例如通過在on_connection_close中設置self.cancelled = True,然後在正在進行的異步工作期間定期檢查此屬性。

+0

謝謝Ben!我還有兩個問題。 1.我的處理程序被寫爲阻塞,我知道這會阻止ioloop。我在執行處理程序之前檢查了'socket'狀態:在標有'MSG_PEEK'的那個'socket'上調用'recv',如果我得到空字符串我認爲連接已經被遠程關閉了,如果我得到了EAGAIN或EWOULDBLOCK異常我知道連接是活着的,這對我適合嗎? 2.我想記錄每個連接的接受時間,我添加了'accept_handler'的日誌,但是我發現每個日誌輸出都是一個接一個的,我認爲它們應該同時出現。 – dawncold

+0

如果您一次只提供一個連接即可,MSG_PEEK技巧可能會有效,但請記住,有時會檢測到關閉連接需要很長時間*。我不明白你的第二個問題(最好把新問題當作新問題而不是評論)。 –