python - python“信号仅在主解释器的主线程中工作”在带有子进程的烧瓶中
问题描述
我目前正在使用烧瓶网络服务器,并且希望在从父进程触发 ctrl+c 时使用一个函数来完成子进程的工作流程。
main.py
是父进程,python3 main.py
直接开始。
并且子进程(app.py
)是在 .popen(...)之后启动的main.py
。
# main.py
def get_flask_env():
flask_env = os.environ.copy()
if "FLASK_APP" not in flask_env:
flask_env["FLASK_APP"] = "./server/app.py"
if "FLASK_ENV" not in flask_env:
flask_env["FLASK_ENV"] = "development"
return flask_env
def start_flask():
flask_env = get_flask_env()
command = []
# the command to start app.py, would be: flask run --host 0.0.0.
command.append(python_command)
command.append("-m")
command.append("flask")
command.append("run")
command.append("--host")
command.append("0.0.0.0")
monitor = subprocess.Popen(command, env=flask_env)
当我启动烧瓶服务器(app.py
)时,我在烧瓶服务器中捕捉到错误以处理清除:
def handle_exit(*args):
# clear multiprocessing here
pass
然后设置signal
in app.py
:
signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)
我在父进程(main.py
)中成功使用了这个,但是如果我在子进程中使用信号,问题是:
signal only works in main thread of the main interpreter
那么如何正确使用信号子进程呢?
编辑:
目前,我使用subprocess.run(...)
linuxmain.py
命令终止所有多处理:pkill
但这不是跨平台方式,可能会在没有正确等待完成的情况下终止进程。
解决方案
行。我的想法是这样的。
import atexit
import os
import subprocess
def teardown(process_handle):
process_handle.terminate() #kill the sub process clean
process_handle.wait()# wait for graceful exit.
def get_flask_env():
flask_env = os.environ.copy()
if "FLASK_APP" not in flask_env:
flask_env["FLASK_APP"] = "./server/app.py"
if "FLASK_ENV" not in flask_env:
flask_env["FLASK_ENV"] = "development"
return flask_env
def start_flask():
flask_env = get_flask_env()
command = []
# the command to start app.py, would be: flask run --host 0.0.0.
command.append(python_command)
command.append("-m")
command.append("flask")
command.append("run")
command.append("--host")
command.append("0.0.0.0")
monitor = subprocess.Popen(command, env=flask_env)
atexit.register(teardown, monitor) #register to execute at exit
推荐阅读
- node.js - 从命令行运行 Cypress 并指向测试文件夹
- react-native - 如何以优化的方式使用 React Native 实现将联系人同步到服务器
- php - Laravel 函数助手 dd() 没有按预期工作
- python - 如果组合 django 中不存在任何一个输入,python 过滤器将返回 none
- excel - 使用 VBA 根据另一个工作簿单元格值过滤数据
- javascript - 在 Google AppScript 中指定直到最后一列的范围
- java - Android Studio:向上/向下滑动部分布局
- c - 使用libav编码时根据经过时间计算帧PTS
- supervisord - 有没有办法自动更新主管?
- c# - 在 C# 中运行和使用 mimikatz