3

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

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

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

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

4

2 回答 2

6

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

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

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

于 2009-07-27T18:25:18.680 回答
1

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

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

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

于 2009-07-25T17:46:42.930 回答