python程序主動退出進程的五種方式
一、使用os.kill()
os.kill()是一種向進程發(fā)送信號的方法,可以用來強制結(jié)束一個進程的運行。如果你的程序中包含有線程,用這種方式絕對沒錯!當(dāng)使用os.kill()方法結(jié)束一個進程時,需要指定該進程的PID(進程號),同時需要指定信號類型。下面是使用os.kill()方法結(jié)束指定ID的程序運行的示例代碼:
import os pid = os.getpid() # 獲取當(dāng)前進程的PID os.kill(pid, signal.SIGTERM) # 主動結(jié)束指定ID的程序運行
二、使用os._exit()
os._exit()是一種基于系統(tǒng)調(diào)用的退出方式,它可以忽略所有的清理活動,包括所有的緩存和終止信號處理器等。當(dāng)使用os.exit()方法退出時,Python解釋器將立即終止程序的運行,不會執(zhí)行任何清理操作并且不會返回狀態(tài)碼。下面是使用os._exit()方法退出程序的示例代碼:
import os os._exit(0) # 退出程序,不返回狀態(tài)碼
三、使用raise SystemExit()
raise SystemExit()是一種簡單的退出方式,它可以引發(fā)一個SystemExit異常,終止程序執(zhí)行,并且可返回一個狀態(tài)碼。在使用raise SystemExit()方法退出時,如果指定了狀態(tài)碼,則會返回該狀態(tài)碼,否則將返回0。下面是使用raise SystemExit()方法退出程序的示例代碼:
raise SystemExit(0) # 退出程序,返回狀態(tài)碼0
四、使用exit()
exit()是一種基于終端指令的退出方式,它可以退出Python解釋器并返回狀態(tài)碼。當(dāng)使用exit()方法退出時,會先執(zhí)行一些清理工作,如關(guān)閉文件等,然后退出Python解釋器。下面是使用exit()方法退出程序的示例代碼:
exit(0) # 退出程序,返回狀態(tài)碼0
五、使用sys.exit()
sys.exit()是一種常用的退出當(dāng)前進程的方法,它可以終止一個程序的運行,并可以返回一個狀態(tài)碼。當(dāng)sys.exit()被調(diào)用時,程序?qū)⒘⒓赐V箞?zhí)行,所有的finally子句(如果有的話)將被忽略,并且返回一個標識狀態(tài)的整數(shù)。下面是使用sys.exit()方法退出程序的示例代碼:
import sys sys.exit(0) # 退出程序,返回狀態(tài)碼0
就像websocket客戶端,當(dāng)服務(wù)端主動關(guān)閉后,客戶端直接退出:
服務(wù)端代碼:
from flask import Flask from flask_sock import Sock app = Flask(__name__) sock = Sock(app) # 創(chuàng)建全局的ws對象數(shù)組 ws_list = [] ws_closed = [] @app.route('/') def index(): return "你好,世界" @app.route('/ws') def websocket(): return """ <!doctype html> <html> <head> <title>Flask-Sock Demo</title> </head> <body> <h1>Flask-Sock Demo</h1> <div id="log"></div> <br> <form id="form"> <label for="text">Input: </label> <input type="text" id="text" autofocus> </form> <script> const log = (text, color) => { document.getElementById('log').innerHTML += `<span style="color: ${color}">${text}</span><br>`; }; const socket = new WebSocket('ws://' + location.host + '/echo'); socket.addEventListener('message', ev => { log('<<< ' + ev.data, 'blue'); }); document.getElementById('form').onsubmit = ev => { ev.preventDefault(); const textField = document.getElementById('text'); log('>>> ' + textField.value, 'red'); socket.send(textField.value); textField.value = ''; }; </script> </body> </html> """ def handle_sync(data, self): # 同步各端ws消息 for ws in ws_list: if not ws.connected: ws_closed.append(ws) elif data and ws != self: ws.send(data) # 刪除已斷開的鏈接 for cl in ws_closed: ws_list.remove(cl) ws_closed.clear() print(f"live num: {len(ws_list)}, done num: {len(ws_closed)}") @sock.route('/echo') def echo(self): global ws_list ws_list.append(self) # 同步消息和關(guān)閉ws clear handle_sync(None, self) while True: print(f"global ws list: {len(ws_list)}") # 判斷是斷開連接還是還在鏈接 data = self.receive() print(f"receive client message: {data}") self.send(data) # 同步消息和關(guān)閉ws clear handle_sync(data, self) if __name__ == '__main__': app.run(host="0.0.0.0", port=8989)
客戶端代碼:
import os import signal import threading import time import websocket def on_open(ws): print("連接已建立") # 發(fā)送消息給服務(wù)器 ws.send("Hello, server!") def on_message(ws, message): print("收到消息:", message) def on_close(ws, arg1, arg2): print("連接已關(guān)閉") pid = os.getpid() # 獲取當(dāng)前進程的PID os.kill(pid, signal.SIGTERM) def on_error(ws, error): print("發(fā)生錯誤:", error) # 創(chuàng)建WebSocket連接 ws = websocket.WebSocketApp("ws://192.168.110.196:8989/echo", on_open=on_open, on_message=on_message, on_close=on_close, on_error=on_error) def sub_task(): while True: print("子線程運行") time.sleep(2) def run(): t = threading.Thread(target=sub_task) t.start() # 啟動WebSocket客戶端 ws.run_forever() if __name__ == '__main__': run()
以上就是python程序主動退出進程的五種方式的詳細內(nèi)容,更多關(guān)于Python程序退出進程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
利用python+ffmpeg合并B站視頻及格式轉(zhuǎn)換的實例代碼
這篇文章主要介紹了利用python+ffmpeg合并B站視頻及格式轉(zhuǎn)換的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11python?reshape和transpose的區(qū)別小結(jié)
reshape()?和?transpose()?是用于改變數(shù)組或張量形狀的兩種不同方法,本文主要介紹了python?reshape和transpose的區(qū)別小結(jié),具有一定參考價值,感興趣的可以了解一下2024-02-02python基于tkinter實現(xiàn)gif錄屏功能
一直在思索實現(xiàn)一個透明的窗體,然后可以基于這個窗體可以開發(fā)出各種好玩的應(yīng)用,這一期,我們將實現(xiàn)有趣的GIF錄屏功能2021-05-05Blueprint實現(xiàn)路由分組及Flask中session的使用詳解
這篇文章主要為大家介紹了Blueprint實現(xiàn)路由分組及Flask中session的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11