python - 通过 C++ 的 RPC 启动新线程会导致进程僵尸化?

标签 python c++ multithreading flask rpc

所以我尝试使用以下代码从 C++ 程序到 Flask 服务器内的 RPC 调用启动一个新线程

@api.route("/open_api_connection")
def open_api_connection():

    # spawn server
    from threading import Thread
    thread = Thread(target = start_message_server)
    thread.start()

    return jsonify({"host":"localhost", "port":8080})

def start_message_server():
    while True:
        time.sleep(1)
        print "in server"

但是当我通过 C++ 程序向该服务器发送 HTTP 请求时,Flask 服务器就无法使用 CTRL-c 杀死。我猜新线程不知何故变成了僵尸。 ps 显示即使在 CTRL-c 之后该进程仍在运行。 CTRL-z 也不起作用...我正在使用内置服务器启动 Flask 服务器,如下所示

api = Flask(__name__)
# import stuff ...

if __name__ == "__main__":

    # check if the port number that is used to run this script has been
    # provided or not
    if len(sys.argv) == 2:
        port = sys.argv[1]
    else:
        sys.stderr.write("Usage: python " + sys.argv[0] + " <port_number>\n")
        sys.exit(1)

    api.run(port = int(sys.argv[1]), threaded = True)

我通过 C++ 调用连接到该服务器,如下所示

open_connection("localhost", "8000");

您知道为什么会发生这种情况以及如何解决此问题吗?

最佳答案

请参阅文档 here :

A thread can be flagged as a “daemon thread”. The significance of this flag is that the entire Python program exits when only daemon threads are left. The initial value is inherited from the creating thread. The flag can be set through the daemon property.

只有当所有非守护线程都退出时,Python 进程才会退出。主线程是处理标准 ctrl-c 事件(通常是 unix 信号 SIGINT)的线程,当它收到该事件时将退出。任何其他非守护线程要么(a)需要意识到主线程已退出,然后自行退出,要么(b)成为当所有其他线程退出时自动退出的守护线程。

创建线程时,请尝试:

thread = Thread(target=start_message_server)
thread.daemon = True
thread.start()

以这种方式创建时,如果线程是唯一正在运行的进程,则该线程不应阻止进程关闭。

关于python - 通过 C++ 的 RPC 启动新线程会导致进程僵尸化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36590132/

相关文章:

c# - BlockingCollection 与异步任务

c++ - 如何在不同的内核上运行不同的线程?

python - 复制 numpy 数组中的行元素

Python 二进制运算

c++ - SDL_Delay 不会在每个 Action 之前延迟

c++ - 没有明确范围的强类型枚举?

c++ - C++ 中 Main 参数的 Const-Qualification

java - Mysql中的队列系统

python - 如何从核苷酸生成 IUPAC 代码?

python - 到不同端口的多个 OpenVPN 连接