python - 使用 Python 和 Flask 长时间运行的任务

标签 python flask

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

问题是,当我尝试停止 Web 服务(内置开发服务器上的 Ctrl+C)时,子进程会停止,而 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)

代码在 Flask 路由处理程序中启动:

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 方法来解决这个问题,尽管这比仅仅生成一个新进程需要更多的复杂性。

最佳答案

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

关于python - 使用 Python 和 Flask 长时间运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13479013/

相关文章:

python - Pytest:设置测试客户端和数据库

python - 如何使用Python从网页的检查元素中获取数据

python - 在不同条件下选择numpy数组中的数据

flask - 如何使用 Flask 在 Debug模式下运行应用程序

Python Flask 上传图片

python - 如何从 Pandas 数据框的确定单元格值创建列表?

python - 迁移期间的 Django 日志记录

python - Mac OSX 10.12.6 上的 Flask mysql 连接错误

python - 504 连接错误 Flask Nginx uWSGI Ubuntu

python - 任何异常的全局错误处理程序