从C++通过RPC启动新线程会导致进程陷入僵尸状态

Starting new thread via an RPC from C++ causes process to be zombied?

本文关键字:进程 状态 僵尸 线程 RPC 通过 C++ 启动 新线程      更新时间:2023-10-16

所以我正试图用以下代码从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杀死。我猜这个新线程不知怎么变成了僵尸。CCD_ 1揭示了即使在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");

有什么想法吗?为什么会发生这种情况,以及我如何解决这个问题?

请参阅此处的文档:

线程可以标记为"守护进程线程"。这一点的意义标志是整个Python程序在只有后台进程线程时退出剩下的。初始值是从创建线程继承的。这个可以通过守护进程属性设置标志。

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

创建线程时,请尝试:

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

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

我使用signal包解决了这个问题,并使用了os._exit(0)

import os
signal.signal(signal.SIGINT, lambda data,frame : os._exit(0))

请记住,os_exit(n)以状态n退出,不调用清理处理程序、刷新stdio缓冲区等。