2010-01-08 13 views
3

我已經編寫了一個專門的JSON-RPC服務器,並開始按照我的方式進入應用程序邏輯,發現它經常不得不停止/重新啓動服務器以進行某些更改是一件煩人的事。對Twisted應用程序的某些部分進行重新加載的策略或支持?

以前我有一個處理程序在間隔中運行,將模塊修改的時間戳與過去的檢查進行比較,然後根據需要重新加載模塊。不幸的是,我不相信它現在能夠正常工作。

有沒有一種方式讓反應器以類似於Paster的Reloadable HTTPServer的方式停止和重新啓動?

+0

目前我正在試圖既Crast的和clemesha的答案......將更新我的問題,並挑選我的情況贏家soonish。 – David 2010-01-09 05:55:34

+0

你知道你在遇到問題時遇到麻煩,並回到3年前問你的問題。 – David 2013-11-29 23:02:51

回答

1

你可以寫類似貼紙的reloader的東西,將工作是這樣的:

  1. 開始你的主要功能,以及導入/使用任何扭曲的代碼之前,叉/派生的子進程。
  2. 在子流程中,運行您的扭曲應用程序。
  3. 在主進程中,運行您的代碼來檢查已更改的文件。如果代碼已更改,請重新加載子進程。

然而,這裏的問題是,與開發Web服務器,最扭曲的應用程序有更多的國家和只是平了殺/重新啓動的過程是一個壞主意,你可能會失去一些狀態。

有一種方法可以做到這一點乾淨:

當產卵扭曲的應用程序,使用subprocess.Popen()或類似,以獲得標準輸入/輸出管道。現在在你的子進程中,使用扭曲的反應堆來監聽stdin(這是扭曲的代碼,參見twisted.internet.stdio,它允許你使用通常的非阻塞方式和一個stdio傳輸協議)。

最後,當你決定重新加載的時候,寫一些東西到子進程的stdin,告訴它關閉。現在你的代碼可以正常響應和關閉。一旦它乾淨地退出,你的主進程就可以重新產生它。

(或者您可以使用信號來實現這一點,但是這可能不是OS移植)

+0

我在想你的計劃可能是我可以採取的最簡單的方法。 – David 2010-01-08 09:07:49

相關問題