2011-02-07 102 views
3

我有一個Python應用程序(帶GUI,使用PyQt4),由用戶在幾個實例中產生。該應用程序是用來執行一些長時間運行的任務(約幾個小時到幾天),所以我願意加上一個額外的「監控」應用程序,將做這樣的事情:Python進程間通信

  • 找出所有正在運行的進程其他應用程序的
  • 獲得運行中的操作的狀態(完成工作,百分比,錯誤消息,...)
  • 最終發送一些命令到應用程序告訴他們暫停,恢復,終止,...

一種適合這項工作的方法是RPyC,唯一的問題,它似乎只能在TCP套接字上工作,就像我找到的大多數RPC庫一樣。但是這導致必須打開幾個不需要的套接字,這些套接字只在本地主機上偵聽,並且必須創建某種端口分配機制以避免兩個進程試圖在同一個端口上偵聽。然後監視器需要一個端口列表來寫入某個地方,或者去查找在TCP端口上偵聽的進程,並試圖找出它們是否是正確的應用程序或ot實例。聽起來像一團糟。

管理互通的最好方法我現在想到的可能是在'/var/run/myapp/myapp-.sock'中有一些unix套接字,然後創建一個模塊所有骯髒的東西暴露了一些方法,如listMyApps()getMyApp(pid)返回第一個pid列表,第二個可用於與該應用程序通信的對象。

現在,我正在尋找最好的方法來實現這個目標。 真的,沒有任何東西可以通過unix套接字管理RPC嗎?聽起來有點奇怪,但我無法找到任何可以裝配的東西。

有什麼建議嗎?

注:我不想扭轉的東西(應用程序是一個單一的監控服務器的客戶端),以避免問題的監測應用程序崩潰的情況下,並讓我自由地創建連接到這些插座其他應用程序並提出請求。

注:安全不是一個問題,因爲所有這些東西是在私人運行,關閉防火牆和網絡:),再加上,請求由只有受信任的用戶在本地主機上完成的。

回答

2

我想我找到了一個soultion使用dbus-python。我能夠將它與Qt4主循環集成在一起,儘管在網站上他們說只支持glib(我猜這個頁面沒有更新)。我只是做了一個qick測試,似乎工作得很好(我只在一條名爲com.example.myapp.<pid>的總線上放置了一些虛擬函數,並列出了實例並從外部客戶端連接)。

然後,我可以使用RPyC東西通過TCP只爲「主」控制應用和「經理」的應用程序,行爲相當像一臺機器上的實例之間的「開關」之間的通信。

一些ASCII藝術澄清:

+-------------------+      
| MASTER APP  |     +--------------------+ 
| on my workstation |------ RPyC --------| Server#0 Manager | 
+-------------------+     +--------------------+ 
     |          | | | 
    RPyC          | | '-- dbus ---[INSTANCE #0] 
     |          | '--- dbus ---[INSTANCE #1] 
    +--------------------+     '---- dbus ---[INSTANCE #2] 
    | Server#1 Manager | 
    +--------------------+ 
     | | | 
     | | '-- dbus ---[INSTANCE #0] 
     | '--- dbus ---[INSTANCE #1] 
     '---- dbus ---[INSTANCE #2] 

如果有人有興趣,只是讓我知道,我會張貼一些代碼示例/詳細信息太..

2

但是這會導致不必打開 一些不必要的插座只監聽localhost ,並且具有 創建某種端口分配 機制,以避免兩個進程 嘗試收聽同一端口上

不完全。首先,這就是大多數進程間通信通過套接字進行工作的方式。無論是TCP套接字還是UNIX套接字。這基本上(不完全)是你在標準化之類的時候所做的。

您也可以使用操作系統信號。雖然你必須記住每個進程只有主線程可以進行信號處理,所以你必須小心不要阻止它。

但是你做的任何方式有利用周圍套接字連接幾乎沒有得到。

+0

我的意思是什麼,我不不想在每個進程的不同端口上設置監聽套接字..我想到了信號,但是它們絕對不足以滿足我需要,因爲我需要按順序在各種應用函數上運行方法以查詢其狀態(不僅完成百分比,但更復雜的細節),或執行一堆操作「就好像用戶點擊XYZ用戶界面按鈕」一樣.. – redShadow 2011-02-07 22:47:57

2

另一種方式去是有某種作業控制體系,而不是讓應用程序啓動自己的過程,有其註冊的工作崗位要啓動的是做任務。然後,作業控制系統將監視開始的作業。作爲獎勵,通過這種設計,您可以在未來的某個時間在多臺機器上進行工作。

+0

是的,這個是一個很好的答案。看看python的多處理庫。 – Falmarri 2011-02-07 19:31:50

+0

你對「職位控制系統」有什麼建議?舊版本的應用程序只是產生了主應用程序的幾個線程(易於用Python處理),並且能夠與它們進行通信,但是我放棄了這種方式,因爲如果出現錯誤,分離的進程更方便(操作失敗嚴重或卡住,應用程序本身存在錯誤,...),甚至有時甚至用STOP/CONT暫停/恢復進程。 – redShadow 2011-02-07 22:52:15