如何在Pylons中启动后台进程?

时间:2009-07-25 17:36:18

标签: python background pylons

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

  1. 使用Pylons控制器启动此类后台进程的最佳方法是什么?

  2. 将后台进程输出返回给用户的最佳方法是什么? (我应该将输出存储在数据库,会话数据等中吗?)

  3. 修改 问题是如果我在控制器中使用subprocess启动命令,控制器会在继续之前等待子进程完成,向用户显示刚刚加载的空白页,直到进程完成。我希望能够在启动子流程后立即将用户重定向到状态页面,允许它自己完成。

2 个答案:

答案 0 :(得分:6)

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

我的网络应用程序通常会发出AJAX请求以“检查”守护程序进程,直到它完成为止。我已经使用了两个tmp文件(cPickle运行良好)和数据库来共享守护进程和Web应用程序之间的信息。

优秀的python守护进程配方:http://code.activestate.com/recipes/278731/

答案 1 :(得分:1)

我认为这与挂架无关。我会在这些步骤中(在任何框架中)这样做:

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

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