2012-08-03 60 views
6

對不起模糊的標題,但我找不到更好的東西。扭曲的反應堆得到當前狀態

有什麼方法可以使反應堆的當前狀態扭轉? 通過狀態我的意思是:

  • 偵聽的端口
  • 互聯協議
  • Deferreds正在等待被解僱
  • LoopingCalls運行
  • 主題是 「閒置」
  • 和其他「活躍」的東西...

基本上我試圖弄清楚反應堆是否只是坐着。 這個問題本身比我實際需要做的更廣泛,爲了完成stackoverflow。

現在,我目前的情況如下:

我用別人的腳本,就由這個人的腳本選擇很多「動態」端口監聽,所以我不能只是用我的腳本執行listenTCP或TCP4ServerEndpoint之類的操作並檢查它的狀態。 這有點類似於非PASV FTP,每次使用後每個偵聽端口都會被丟棄。 另一個問題是我自己的小程序也運行在同一個進程中,我用它作爲參數來啓動他的程序。這基本上是他的程序的一個接口。當他所有的事情都完成了,我的事情也完成了,我想關閉反應堆。因此,我試圖弄清楚什麼時候可以停止反應堆。 我的確切情況關機如下:

  • 只能監聽1端口,而不能監聽其他端口。
  • 沒有緩存,也沒有loopingCalls會發射。

我搜索,但只發現像「如reactor.running」或Stop twisted reactor on a condition,需要通過使用標誌保持跟蹤的東西。 我不想碰他的代碼。如果這可能會導致扭曲,我寧願這樣做。 但是,如果已經有其他選擇,我寧願不重新發明輪子。

他的腳本是否需要更改,以便通知腳本這些條件?

回答

2

您要調用的代碼應該被重構以返回某個Deferred;可能是一個執行IService.stopService停止它。這樣做的原因是,即使事情顯然是「閒置」的,你並不總是知道在反應堆中會坐着什麼。例如,你是否知道Twisted維護一個文件描述符(「waker」)用於從線程進行通信? HTTP服務器始終保持未完成的callLater以寫入下一個訪問日誌條目?第三方庫中的其他基礎架構可能會在反應堆中留下任意不同的狀態,這與您無關。

雖然這個反應堆確實有一點反思支持。例如,有IReactorTime.getDelayedCalls,IReactorFDSet.getReaders/getWritersIReactorThreads.getThreadPool。然而,沒有IReactorWin32Events.getAllEvents,所以這不是一個完全便攜的東西。爲了調試和診斷目的,如果您想貢獻更多的反應堆內省實現,我們一定會很感激。

+0

感謝標誌符號的答案。 – SleepyMan 2012-08-03 14:10:52

+0

謝謝@Glyph的答案。按習慣進入。我真的不想惹他的代碼因爲我的哲學與他的衝突。但是如何將我的代碼與IService集成在一起?不同的進程通過套接字通信?好吧,無論如何,我會通知他他的劇本需要改變。同時,在實際貢獻之前,我會嘗試更多地瞭解一下扭曲的內部結構(我認爲了解扭曲的哲學是很好的,對吧?)。學習這些東西的唯一方法是閱讀源代碼或將它記錄在某處? – SleepyMan 2012-08-03 14:24:43