2013-02-05 49 views
1
方法

我的設置如下 - 我有一個幾乎是「Hello World」示例基於龍捲風HTTP服務器:調用另一個進程的Python中

server = tornado.httpserver.HTTPServer(app) 
server.bind(8888) 
server.start(2) 
tornado.ioloop.IOLoop.instance().start() 
在此設置

現在,我也有另一個進程(讓我們稱之爲控制過程)由根進程產生。因此,這個控制過程是兩個龍捲風處理程序的兄弟姐妹。當然,我可以通過由根進程創建的管道在處理程序進程和控制進程之間進行通信。然而,我更感興趣的是調用一個控制過程的方法並獲取它的輸出。

做這樣的事情的最佳方法是什麼?如果我使用管道將處理程序的請求發送到控件並返回結果,我應該使用鎖來實現過程安全嗎?

回答

0

你不需要鎖定管道。管道是它自己的同步。或者,換一種方式,管道的兩側是獨立的物體。 (當然,控制進程可能需要一個內部鎖,例如,如果它是從主事件循環以外的其他線程處理管道,並且需要與主循環中運行的代碼共享任何數據,但那不是與進程間安全相關)。

無論如何,如果您退後一步並從更高級別考慮此問題,您要實現的是RPC機制的確切定義。如果你正在做的事情很簡單,用這種方式從頭開始實施它是可行的,但如果不是這樣,你可能想要添加另一個協議到control,讓Tornado和你現有的協議一起管理它。

+0

是的,它恰好是一個RPC。是的,我不知何故感到困惑,來自兩個處理程序的兩個輸入和它們的輸出可能混在一起(對我感到羞恥)。由於我對Tornado頗爲新穎,你能否指定「爲控制添加另一個協議」的含義? – dmg

+0

@DJV:我的意思是......無論你是什麼意思,你在問題中使用了四次這個名字。你想要一些「處理程序」來提出反對「控制程序」的請求。所以,如果這個「控制過程」已經在使用Tornado來實現,例如,一個Web應用服務器或者一個JSON-RPC-over-sockets服務器或者其他任何東西,那麼只需添加另一個協議供其他進程使用,而不是實現從頭開始獨立的東西。 – abarnert

相關問題