• python程序主动退出进程的方式:五种方式总有一种适合你


    一、使用os.kill()

    os.kill()是一种向进程发送信号的方法,可以用来强制结束一个进程的运行。如果你的程序中包含有线程,用这种方式绝对没错!当使用os.kill()方法结束一个进程时,需要指定该进程的PID(进程号),同时需要指定信号类型。下面是使用os.kill()方法结束指定ID的程序运行的示例代码:

    1. import os
    2. pid = os.getpid() # 获取当前进程的PID
    3. os.kill(pid, signal.SIGTERM) # 主动结束指定ID的程序运行

    二、使用os._exit()

    os._exit()是一种基于系统调用的退出方式,它可以忽略所有的清理活动,包括所有的缓存和终止信号处理器等。当使用os.exit()方法退出时,Python解释器将立即终止程序的运行,不会执行任何清理操作并且不会返回状态码。下面是使用os._exit()方法退出程序的示例代码:

    1. import os
    2. os._exit(0) # 退出程序,不返回状态码

    三、使用raise SystemExit()

    raise SystemExit()是一种简单的退出方式,它可以引发一个SystemExit异常,终止程序执行,并且可返回一个状态码。在使用raise SystemExit()方法退出时,如果指定了状态码,则会返回该状态码,否则将返回0。下面是使用raise SystemExit()方法退出程序的示例代码:

    raise SystemExit(0) # 退出程序,返回状态码0

    四、使用exit()

    exit()是一种基于终端指令的退出方式,它可以退出Python解释器并返回状态码。当使用exit()方法退出时,会先执行一些清理工作,如关闭文件等,然后退出Python解释器。下面是使用exit()方法退出程序的示例代码:

    exit(0) # 退出程序,返回状态码0

    五、使用sys.exit()

    sys.exit()是一种常用的退出当前进程的方法,它可以终止一个程序的运行,并可以返回一个状态码。当sys.exit()被调用时,程序将立即停止执行,所有的finally子句(如果有的话)将被忽略,并且返回一个标识状态的整数。下面是使用sys.exit()方法退出程序的示例代码:

    1. import sys
    2. sys.exit(0) # 退出程序,返回状态码0

    就像websocket客户端,当服务端主动关闭后,客户端直接退出: 

    服务端代码:

    1. from flask import Flask
    2. from flask_sock import Sock
    3. app = Flask(__name__)
    4. sock = Sock(app)
    5. # 创建全局的ws对象数组
    6. ws_list = []
    7. ws_closed = []
    8. @app.route('/')
    9. def index():
    10. return "你好,世界"
    11. @app.route('/ws')
    12. def websocket():
    13. return """
    14. Flask-Sock Demo
    15. Flask-Sock Demo


    16. """
    17. def handle_sync(data, self):
    18. # 同步各端ws消息
    19. for ws in ws_list:
    20. if not ws.connected:
    21. ws_closed.append(ws)
    22. elif data and ws != self:
    23. ws.send(data)
    24. # 删除已断开的链接
    25. for cl in ws_closed:
    26. ws_list.remove(cl)
    27. ws_closed.clear()
    28. print(f"live num: {len(ws_list)}, done num: {len(ws_closed)}")
    29. @sock.route('/echo')
    30. def echo(self):
    31. global ws_list
    32. ws_list.append(self)
    33. # 同步消息和关闭ws clear
    34. handle_sync(None, self)
    35. while True:
    36. print(f"global ws list: {len(ws_list)}")
    37. # 判断是断开连接还是还在链接
    38. data = self.receive()
    39. print(f"receive client message: {data}")
    40. self.send(data)
    41. # 同步消息和关闭ws clear
    42. handle_sync(data, self)
    43. if __name__ == '__main__':
    44. app.run(host="0.0.0.0", port=8989)

     客户端代码:

    1. import os
    2. import signal
    3. import threading
    4. import time
    5. import websocket
    6. def on_open(ws):
    7. print("连接已建立")
    8. # 发送消息给服务器
    9. ws.send("Hello, server!")
    10. def on_message(ws, message):
    11. print("收到消息:", message)
    12. def on_close(ws, arg1, arg2):
    13. print("连接已关闭")
    14. pid = os.getpid() # 获取当前进程的PID
    15. os.kill(pid, signal.SIGTERM)
    16. def on_error(ws, error):
    17. print("发生错误:", error)
    18. # 创建WebSocket连接
    19. ws = websocket.WebSocketApp("ws://192.168.110.196:8989/echo",
    20. on_open=on_open,
    21. on_message=on_message,
    22. on_close=on_close,
    23. on_error=on_error)
    24. def sub_task():
    25. while True:
    26. print("子线程运行")
    27. time.sleep(2)
    28. def run():
    29. t = threading.Thread(target=sub_task)
    30. t.start()
    31. # 启动WebSocket客户端
    32. ws.run_forever()
    33. if __name__ == '__main__':
    34. run()

  • 相关阅读:
    vs2022编译Qt5.12.9静态库
    十分钟轻松入门 nw.js 实现桌面应用程序
    【强烈推荐】视频转gif、图片拼gif,嘎嘎好用,免费免费真的免费,亲测有效,无效过来打我
    [附源码]Python计算机毕业设计宠物寄养管理系统
    大端和小端模式
    ST推出 28nm MCU ,NXP更狠,推出16nm MCU
    弘辽科技:拼多多改销量会降权吗?什么情况下会降权?
    67 跳跃游戏 II
    Python数据攻略-Pandas时间序列数据处理
    windows10上mysql5.7下载以及安装
  • 原文地址:https://blog.csdn.net/weixin_44786530/article/details/133348562