2011-03-24 55 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

相关问题