【问题标题】:Starting new thread via an RPC from C++ causes process to be zombied?从 C++ 通过 RPC 启动新线程会导致进程成为僵尸?
【发布时间】:2016-08-04 01:28:01
【问题描述】:

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

@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");

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

【问题讨论】:

    标签: python c++ multithreading flask rpc


    【解决方案1】:

    查看文档here

    可以将线程标记为“守护线程”。这件事的意义 flag 是当只有守护线程时整个 Python 程序退出 留下了。初始值继承自创建线程。这 flag 可以通过 daemon 属性设置。

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

    创建线程时,请尝试:

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

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

    【讨论】:

    • 它给了我一个意外的参数错误。但我明白你的意思。我会看看是否有其他方法来设置守护进程属性。如果您可以更改答案以反映正确的答案,我会尽快将其标记为已接受!
    • 我认为Thread对象需要设置一个名为daemon的成员变量,而不是构造函数的命名参数!
    • 接受你的回答!
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2018-06-06
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      相关资源
      最近更新 更多