使用Python和Flask执行长时间的任务

时间:2012-11-20 17:46:35

标签: python flask

我有一个相当大的数据库导入作业,我从Web界面(Flask)开始。当访问触发数据库导入的URL时,我在进行数据库插入之前进行fork。

问题在于,当我尝试停止Web服务(内置开发服务器上的Ctrl + C)时,子进程停止,并且Web服务器继续在后台运行。不知何故,似乎Web服务器作业突然被推送成为后台守护进程,而子进程现在是主要进程。

我想要实现的是“启动子进程然后忘记它”的方法,其中Web服务器只是启动子进程,然后再也不会打扰它,特别是当涉及异常和类似时。

关于如何最好地解决这个问题的任何想法?

目前导入功能的测试代码是:

def import_start():
    try:
            pid = os.fork()
    except OSError as e:
            print "Exception in import_start"
            sys.exit(1)
    if pid == 0:
          with open("/tmp/web_out.txt", "w") as f:
                for x in range(100):
                      f.write("line %d\n" % (x))
                      f.flush()
                      sleep(10)

代码在烧瓶路径处理程序中启动:

import_start()

之后使用Ctrl + C将终止import_start()进程而不是Web服务器。我想让它成为另一种方式,因为两个进程在发布后应完全相互独立。

更新:

我最终做了:

def start_import():
            subprocess.Popen([sys.executable,__file__],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

def do_import():
    with open("/tmp/web_out.txt", "w") as f:
            for x in range(100):
                    f.write("line %d\n" % (x))
                    f.flush()
                    sleep(10)

if __name__ == "__main__":
    do_import()

这样做(除了在我的网络服务器被杀死时杀死了生成的进程),但是我有点担心没有以某种方式清理进程。我可能会研究MQ方法来解决这个问题,尽管这需要比产生新流程更复杂。

1 个答案:

答案 0 :(得分:3)

也许python-daemon可以提供帮助。这主要用于启动python程序作为守护进程。 Afaik它执行双叉魔法并将过程从当前分离。