从烧瓶中启动分离过程
Launch detached process from flask
从 flask 启动子进程并重新启动 flask 也会终止子进程。
有人知道如何从主进程中分离进程吗?所以如果我杀死主进程,子进程将保持活动状态?
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)
此代码将执行另一个需要很长时间处理的程序...如果我重新启动 flask 应用程序,此进程也会死掉,我需要找到一种从主进程分离的方法...
谢谢
我采用的解决方案是使用wgwz提到的celery
而是J.F的解。塞巴斯蒂安也是正确的。
...不是很简单:
你可以在你的 "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 可能会有所帮助),捕获错误至关重要。
您还可以使用套接字、管道或 db
与进程进行通信
此外,在每次尝试实施后不要忘记检查 Zombi,这会传播很多僵尸...
玩得开心!
从 flask 启动子进程并重新启动 flask 也会终止子进程。
有人知道如何从主进程中分离进程吗?所以如果我杀死主进程,子进程将保持活动状态?
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)
此代码将执行另一个需要很长时间处理的程序...如果我重新启动 flask 应用程序,此进程也会死掉,我需要找到一种从主进程分离的方法...
谢谢
我采用的解决方案是使用wgwz提到的celery
而是J.F的解。塞巴斯蒂安也是正确的。
...不是很简单:
你可以在你的 "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 可能会有所帮助),捕获错误至关重要。 您还可以使用套接字、管道或 db
与进程进行通信此外,在每次尝试实施后不要忘记检查 Zombi,这会传播很多僵尸...
玩得开心!