2009-07-25 51 views
3

我正在尝试编写一个应用程序,允许用户启动相当长时间的运行过程(5-30秒)。它应该允许用户在生成过程时检查过程的输出。输出将仅用于用户当前的会话,因此不需要长期存储任何内容。我有一个关于如何做到这一点的同时服用塔框架的优势两个问题:如何在Pylons中启动后台进程?

  1. 什么是启动一个后台进程的最佳途径,如这与主塔控制器?

  2. 什么是获得后台输出到用户输出的最佳方式? (我应该输出存储在数据库中,在会话数据,等等?)

编辑: 的问题是,如果我在推出一个控制器使用subprocess命令,为子控制器等待在继续之前完成,向用户显示一个刚刚加载的空白页面,直到该过程完成。我希望能够在启动子进程后立即将用户重定向到状态页面,并允许它自行完成。

回答

6

我已经通过让我调用的第二个进程守护进程来处理过去的这个问题(通过HTTP调用的长时间运行的进程)。你的Pylons控制器对你的第二个进程进行系统调用(传递任何需要的数据),第二个进程立即成为一个守护进程。这会结束系统调用,您的控制器可以返回。

我的网络应用程序通常会发出AJAX请求来“检查”守护进程,直到它完成。我已经使用了两个tmp文件(cPickle工作正常)和数据库来共享守护进程和web-app之间的信息。

优秀蟒蛇守护配方:http://code.activestate.com/recipes/278731/

+0

我正在碰到这个问题。是安全的吗?如果你每分钟有10000个用户呢?大部分请求都非常昂贵?那你会有很多守护进程在运行吗?另外,你是否建议运行一个守护进程的进程?谢谢。 – User007 2012-07-22 12:42:52

1

我认为这与挂架无关。我会做(在任何框架)在下列步骤操作:

  • 产生新作业一些ID,并在数据库中添加一条记录。
  • 创建一个新的过程,例如,通过子进程模块,并通过命令行(*)传递ID。
  • 具有处理其输出写到/tmp/project/ID
  • 在外挂架,实现形式/job/ID/job?id=ID的网址。这将查看数据库中作业是否完成,并将临时输出合并到页面中。

(*)子进程可能会立即创建另一个进程,并让pylons进程等待第一个子进程,这样就不会有僵尸进程。

+0

预测的临时文件名通常是不安全的 - 它们可以被滥用覆盖到你的Web服务器有写访问任意文件。我会建议在/ var下使用预先创建的(具有适当的权限)目录。 – 2009-09-17 19:13:04