代码之家  ›  专栏  ›  技术社区  ›  Dave Forgac Eli Bendersky

如何在塔架中启动后台进程?

  •  3
  • Dave Forgac Eli Bendersky  · 技术社区  · 17 年前

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

    1. 使用Pylons控制器启动这样的后台进程的最佳方式是什么?

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

    subprocess 在控制器中,控制器等待子流程完成后再继续,向用户显示一个空白页面,该页面正在加载,直到流程完成。我希望能够在启动子流程后立即将用户重定向到状态页面,从而允许它自己完成。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Mark    16 年前

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

    我的web应用程序通常会发出AJAX请求来“检查”守护进程,直到它完成。我使用了tmp文件(cPickle工作得很好)和数据库在守护进程和web应用程序之间共享信息。

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

        2
  •  1
  •   Martin v. Löwis    17 年前

    • 为新作业生成一些ID,并在数据库中添加记录。
    • 创建新流程,例如通过子流程模块,并在命令行(*)上传递ID。
    • 让进程将其输出写入 /tmp/project/ID
    • /job/ID /job?id=ID

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