【问题标题】:Launch detached process from flask从烧瓶启动分离过程
【发布时间】:2016-05-23 20:21:32
【问题描述】:

从烧瓶中启动子进程并重新启动烧瓶也会杀死子进程。

有人知道如何将进程与主进程分离吗?所以如果我杀死主进程,子进程将保持活动状态?

Es:

当我打开一条路线时,在主烧瓶应用程序中,例如 /store_changes 应用程序运行以下代码:

subprocess.Popen("python hdb_store_changes.py --country {0} --id_first_level {1} --threads {2} --qty {3} --username {4}".format(country.upper(),id_first_level,threads,fixedqty,username), shell=True,stdout=subprocess.PIPE)

这段代码将执行另一个需要很长时间才能处理的程序……如果我重新启动烧瓶应用程序,这个进程也会死掉,我需要找到一种方法来脱离主进程……

谢谢

【问题讨论】:

  • 芹菜。这里有一个介绍:blog.miguelgrinberg.com/post/using-celery-with-flask
  • 如果你想让它继续运行,即使flask 已经死了,那么谁从它的标准输出中读取?如果答案是否定的,那么放弃stdout=PIPE——不要使用stdout=PIPE,除非您在进程运行时从管道中读取数据,否则当相应的操作系统管道缓冲区填满时,它可能会挂起。 To hide the output, use stdout=DEVNULL。不相关:删除 shell=True 并将参数作为列表传递。

标签: python flask subprocess detach


【解决方案1】:

我采用的解决方案是使用wgwz提到的芹菜

但是 J.F. Sebastian 的解决方案也是正确的。

【讨论】:

    【解决方案2】:

    ...不是很简单:

    您可以在“hdb_store_changes.py”模块上设置它

    try:
        pid = os.fork()
        if pid > 0:
            # Exit first parent
            _logger.info("Exit first parent PID %d" % pid)
            sys.exit(0)
    except OSError as e:
        msg = "fork_child #1 failed: %d (%s)" % (e.errno, e.strerror)
        _logger.info(msg)
        sys.exit(1)
    
    # Decouple from parent environment
    os.setsid()
    os.umask(0)
    
    # Do second fork_child
    try:
        pid = os.fork()
        if pid > 0:
            # Exit from second parent; print eventual PID before exiting
            _logger.info("Daemon PID %d" % pid)
            sys.exit(0)
    except OSError as e:
        _logger.info("fork_child #2 failed: %d (%s)" % (
            e.errno, e.strerror))
        sys.exit(1)
    ...
    [...code ...]  
    ..
    if __name__ == '__main__':
        main()
    

    在你的烧瓶中设置一个函数,如:

    def fork_child(args, env, cwd=ROOT):
        cmd = shlex.split(args)
        process = subprocess.Popen(args=cmd, stdin=None, stdout=None, stderr=None,
                                   cwd=cwd, close_fds=True, env=env)
        _logger.info('detached process pid %s' % process.pid)
        return process.pid
    

    然后将其用作

    import sys
    env = os.environ
    env['PYTHONPATH'] = ','.join(sys.path)
    fork_child(args='python3 hdb_store_changes.py', env=env, cwd=ROOT)
    

    还必须确保代码中的所有内容都正确关闭(atexit 可能会有所帮助),捕捉错误至关重要。 您还可以使用套接字、管道或数据库与进程通信

    另外,每次尝试实施后不要忘记检查僵尸,这会传播很多僵尸......

    玩得开心!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2019-01-02
      • 1970-01-01
      • 2019-08-14
      • 2017-10-18
      • 2019-12-16
      相关资源
      最近更新 更多