如何在Pylons中启动后台进程?
我正在尝试写一个应用程序,让用户可以启动一个比较耗时的过程(大约5到30秒)。然后,用户可以查看这个过程生成的输出。因为这些输出只需要在用户当前的会话中使用,所以不需要长期保存。我有两个问题,想知道如何在使用Pylons框架的情况下实现这个功能:
在Pylons控制器中,启动这样的后台进程最好的方法是什么?
将后台进程的输出返回给用户的最佳方式是什么?(我应该把输出存储在数据库里,还是会话数据中等等?)
补充说明:
问题在于,如果我在控制器中使用subprocess
来启动一个命令,控制器会等这个子进程完成后才继续,这样用户就会看到一个空白页面,一直在加载,直到这个过程完成。我希望在启动子进程后,能够立即把用户重定向到一个状态页面,让它自己完成。
2 个回答
1
我觉得这跟pylons关系不大。不管用什么框架,我会按照以下步骤来做:
- 先给新工作生成一个ID,然后在数据库里添加一条记录。
- 创建一个新进程,比如通过subprocess模块,并在命令行上传递这个ID(*)。
- 让这个进程把它的输出写到
/tmp/project/ID
这个位置。 - 在pylons里,设置一些URL,比如
/job/ID
或者/job?id=ID
。这样就可以查数据库看看这个工作是否完成,然后把临时的输出合并到页面上。
(*) 可能让子进程立即再创建一个进程会更好,这样pylons进程就可以等第一个子进程结束,这样就不会有僵尸进程了。
6
我之前处理过这个问题(通过HTTP调用的长时间运行的进程),我让第二个进程变成一个守护进程。你的Pylons控制器会发出一个系统调用,去调用第二个进程(传递所需的数据),然后第二个进程立刻变成守护进程。这样一来,系统调用就结束了,你的控制器就可以返回了。
我的网页应用通常会发出AJAX请求,来“检查”这个守护进程,直到它完成。我用过临时文件(cPickle效果不错)和数据库来在守护进程和网页应用之间共享信息。
这里有一个很棒的Python守护进程的做法:http://code.activestate.com/recipes/278731/