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

3 投票
2 回答
1090 浏览
提问于 2025-04-15 13:09

我正在尝试写一个应用程序,让用户可以启动一个比较耗时的过程(大约5到30秒)。然后,用户可以查看这个过程生成的输出。因为这些输出只需要在用户当前的会话中使用,所以不需要长期保存。我有两个问题,想知道如何在使用Pylons框架的情况下实现这个功能:

  1. 在Pylons控制器中,启动这样的后台进程最好的方法是什么?

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

补充说明: 问题在于,如果我在控制器中使用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/

撰写回答