如何在线程结束时终止主程序?在Python中仍然收到等待进程分离的消息?

19 浏览
0 Comments

如何在线程结束时终止主程序?在Python中仍然收到等待进程分离的消息?

我有一个主程序,定义如下:

main.py

def main():
try:
    registry.start_server()
except:
    print("关闭程序")
    pass
if __name__ == '__main__':
    main()

registry.start_server()是另一个模块中的方法,代码如下:

def start_server():
    t_server = threading.Thread(target=server.start)
    t_server.start()
    try:
        t_server.join()
    except KeyboardInterrupt:
        print("错误")
        raise ValueError
finally:
    fp.close()

server.start是另一个模块中的方法,以while(True)的方式执行一些监听工作。我不确定在PyCharm中点击停止按钮(Ctrl + C信号)时如何停止整个程序。我尝试过使用Event,但没有成功。当信号被捕获时,通过引发异常进入到main.py,但这并不能终止整个程序。它显示"等待程序断开连接"。唯一的方法是使用SIGKILL。我不明白程序卡住的地方在哪里?我还尝试了在信号被捕获时调用sys.exit(0)和将线程设置为守护线程,但都没有帮助。

编辑

另一个模块中的while True方法

def start(self, event):
 try:
        while True:
            if event.is_set():
                if self.pubsub.channels:
                    print("进入此处")
                    message = self.pubsub.get_message(True)
                    if message:
                          . 
                          .
                          .
           else:
                return

0
0 Comments

问题出现的原因是:主线程在子线程结束后仍在等待子线程分离。

解决方法是:

1. 让子线程退出。

2. 让主线程等待子线程结束。

代码示例:

import threading
def child_thread():
    # 子线程的代码逻辑
# 创建子线程
thread = threading.Thread(target=child_thread)
# 启动子线程
thread.start()
# 等待子线程结束
thread.join()

通过以上代码,可以解决在Python中主程序在子线程结束后仍然等待子线程分离的问题。

0