2009-09-15 39 views
1

我需要像Python一樣運行一個服務器端腳本「永遠」(或儘可能長時間不丟失狀態),以便它們可以保持sockets open,並對接收到的數據等異步事件作出反應。例如,如果我使用Twisted進行套接字通信。永久運行服務器端腳本的方式有哪些?

  • 我該如何管理這樣的事情?
  • 我困惑嗎?還是有更好的方法來實現異步套接字通信?
  • 通過Apache服務器啓動腳本一次後,如何阻止它運行?

回答

3

如果您正在使用雙絞線那麼它有用於啓動和停止守護程序的整體架構。

http://twistedmatrix.com/projects/core/documentation/howto/application.html

我將如何管理這樣的事情?

扭很適合這個,閱讀上面

鏈接上午我困惑?還是有更好的方法來實現異步套接字通信?

Twisted是在異步Socket通信非常好。直到你得到它的竅門,它在腦子裏很難!

通過Apache服務器啓動腳本一次後,我該如何阻止它運行?

扭曲的工具假定有命令行訪問,所以如果我明白你想做什麼,你必須編寫一個cgi封裝來啓動/停止它們。

1

您可以直接編寫一個腳本,在一段時間內連續等待連接發生並等待信號關閉它。

http://docs.python.org/library/signal.html

然後停止它,你只需要運行另一個腳本發送該信號給他。

0

我認爲Comet是你在找什麼。一定要看看龍捲風。

1

您可以使用'雙叉'在未綁定到新舊後臺進程的新後臺進程中運行您的代碼。請參閱比如this配方,並提供比您想要的更多解釋性評論。

我不會推薦這個作爲運行網站後臺任務的主要方式。例如,如果你的Python被嵌入到Apache進程中,你會分叉得比你想要的多。最好單獨調用守護進程(就在類似的低特權用戶下)。

通過Apache服務器啓動腳本一次後,我該如何阻止它運行?

你有你的第二叉寫守護進程到文件的進程號(PID),然後從文件中讀取PID併發送一個終止信號(os.kill(pid, signal.SIG_TERM))。

我困惑嗎?

這就是問題!我假設你正試圖讓一個後臺進程在不同的端口上響應Web界面的某種不尋常的網絡服務。如果您僅僅是在迴應正常的Web請求,那麼您就不應該這樣做,您應該依靠Apache來處理您的套接字並一次處理一個請求。

0

你可能想看看FastCGI,它聽起來像你正在尋找的,但我不確定它是否在當前的發展。它使用CGI守護進程和特殊的apache模塊與它進行通信。由於守護進程長時間運行,因此您沒有fork/exec成本。但作爲管理自己資源的成本(對每個請求沒有自動清理)

FastCGI的這種風格不再被使用的原因之一是可以將解釋器嵌入到Apache二進制文件中並讓它們運行服務器。我不熟悉mod_python,但我知道mod_perl的配置允許長時間運行的進程。這裏要小心,因爲服務器中長時間運行的進程會導致資源泄漏。

一個普遍的問題是:你想要做什麼?爲什麼你需要這個第二個過程,但不知何故由apache控制?爲什麼不能建立一個與Apache對話的守護進程,爲什麼它必須由apache控制?