2011-03-24 40 views
0

所以我有一個後臺程序,我需要公開/控制作爲一個Web服務。我已經封裝了進程以便能夠通過管道接受命令,但現在我正試圖找出如何控制它。Python:DJango如何擁有一個長期運行的過程?

要求如下:

  1. 需要能夠通過網絡啓動進程
  2. 需要能夠發送CMDS
  3. 需要能夠從CMDS
  4. 返回結果
  5. 過程一旦開始活着直到死亡

我認爲主要問題是如何讓django擁有這個過程?從某種意義上說,保留一個有效的保存管道以供將來與後臺進程通信。現在,它的東西沿着線(只是一個例子):

if __name__ == '__main__': 
to_process_pipe, process_pipe = Pipe() 
node = PFacade(process_pipe) 
p.start() 

to_process_pipe.send(['connect']) 
print to_process_pipe.recv() 

p.killed = True 
p.join() 

我想我需要一個更好的辦法是能夠溝通,BC我不知道我怎麼會在管道儲存在Django。


如果您打算使用芹菜回答,請給我一個很好的解釋。

+0

你從不想讓Django擁有它,因爲你不一定知道你將運行多少個Django進程。 – 2011-03-24 13:04:39

+0

是的,我正在用芹菜Queue替換管道,只是不知道是否有更好的方法。 – Nix 2011-03-24 13:07:04

回答

0

我最終的解決方案是編寫一個基於pidbox.Mailbox的自定義「郵箱」。它們的實現非常糟糕,但算法是穩定的。

我基本上站了一個通過django託管的REST API,然後讓剩下的API向AMQP Queue發送消息(QPID實現)。

我再有這樣的坐鎮,監控隊列,當他們來到沿任何命令passess的過程。

它運作良好,是相當真棒,當它走到了一起。

-1

也許Celery(基於分佈式消息傳遞的異步任務隊列/作業隊列)適合您的賬單。

+0

我明確表示,如果你打算說芹菜,請給我一個很好的/生產的例子。 – Nix 2011-03-24 13:07:43

+0

對不起,我錯過了那條線。 – jammon 2011-03-24 13:43:57

0

好的,所以你想要一個進程啓動並運行並接受來自django工作人員的命令?

在這種情況下,芹菜將不會是一個好的解決方案,因爲任務產生後不會提供通信

IMHO了良好的解決方案將是爲具有守護進程(如django的管理命令來實現)與無限主迴路,運行之間一些睡眠,監聽來自特定隊列中的命令。

對於溝通 - kombu/django-kombu將是偉大的(這是芹菜的一部分)。

+0

你能解釋一下你在'任務產生後不提供通信'的意思嗎?' – Nix 2011-03-24 13:53:25

+0

因爲當任務已經運行時,沒有*定義的*通信方法。 芹菜是專爲任務(所以開始一些事情和完成),而不是池永恆的守護進程,例如當他們死亡時啓動它們。 – Jerzyk 2011-03-24 13:59:13

+0

我們如何處理kombu的請求/響應?我們只是在做reply_tos嗎? – Nix 2011-03-24 14:01:35

相關問題