我正在尝试编写一个允许用户启动相当长时间运行(5-30秒)的应用程序。然后,它应该允许用户在生成过程时检查过程的输出。只有用户当前会话才需要输出,因此不需要长期存储任何内容。关于如何在利用Pylons框架的同时实现这一点,我有两个问题:
使用Pylons控制器启动此类后台进程的最佳方法是什么?
将后台进程输出返回给用户的最佳方法是什么? (我应该将输出存储在数据库,会话数据等中吗?)
修改
问题是如果我在控制器中使用subprocess
启动命令,控制器会在继续之前等待子进程完成,向用户显示刚刚加载的空白页,直到进程完成。我希望能够在启动子流程后立即将用户重定向到状态页面,允许它自己完成。
答案 0 :(得分:6)
我过去通过调用第二个进程守护进程来处理这个问题(通过HTTP调用长时间运行的进程)。您的Pylons控制器对第二个进程进行系统调用(传递所需的任何数据),第二个进程立即成为一个守护进程。这结束了系统调用,您的控制器可以返回。
我的网络应用程序通常会发出AJAX请求以“检查”守护程序进程,直到它完成为止。我已经使用了两个tmp文件(cPickle运行良好)和数据库来共享守护进程和Web应用程序之间的信息。
优秀的python守护进程配方:http://code.activestate.com/recipes/278731/
答案 1 :(得分:1)
我认为这与挂架无关。我会在这些步骤中(在任何框架中)这样做:
/tmp/project/ID
/job/ID
或/job?id=ID
形式的网址。这将查看数据库是否完成作业,并将临时输出合并到页面中。(*)子进程可能更好地立即创建另一个进程,并让pylons进程等待第一个子进程,这样就不会有僵尸进程。