python程序主動(dòng)退出進(jìn)程的五種方式
一、使用os.kill()
os.kill()是一種向進(jìn)程發(fā)送信號(hào)的方法,可以用來強(qiáng)制結(jié)束一個(gè)進(jìn)程的運(yùn)行。如果你的程序中包含有線程,用這種方式絕對(duì)沒錯(cuò)!當(dāng)使用os.kill()方法結(jié)束一個(gè)進(jìn)程時(shí),需要指定該進(jìn)程的PID(進(jìn)程號(hào)),同時(shí)需要指定信號(hào)類型。下面是使用os.kill()方法結(jié)束指定ID的程序運(yùn)行的示例代碼:
import os pid = os.getpid() # 獲取當(dāng)前進(jìn)程的PID os.kill(pid, signal.SIGTERM) # 主動(dòng)結(jié)束指定ID的程序運(yùn)行
二、使用os._exit()
os._exit()是一種基于系統(tǒng)調(diào)用的退出方式,它可以忽略所有的清理活動(dòng),包括所有的緩存和終止信號(hào)處理器等。當(dāng)使用os.exit()方法退出時(shí),Python解釋器將立即終止程序的運(yùn)行,不會(huì)執(zhí)行任何清理操作并且不會(huì)返回狀態(tài)碼。下面是使用os._exit()方法退出程序的示例代碼:
import os os._exit(0) # 退出程序,不返回狀態(tài)碼
三、使用raise SystemExit()
raise SystemExit()是一種簡單的退出方式,它可以引發(fā)一個(gè)SystemExit異常,終止程序執(zhí)行,并且可返回一個(gè)狀態(tài)碼。在使用raise SystemExit()方法退出時(shí),如果指定了狀態(tài)碼,則會(huì)返回該狀態(tài)碼,否則將返回0。下面是使用raise SystemExit()方法退出程序的示例代碼:
raise SystemExit(0) # 退出程序,返回狀態(tài)碼0
四、使用exit()
exit()是一種基于終端指令的退出方式,它可以退出Python解釋器并返回狀態(tài)碼。當(dāng)使用exit()方法退出時(shí),會(huì)先執(zhí)行一些清理工作,如關(guān)閉文件等,然后退出Python解釋器。下面是使用exit()方法退出程序的示例代碼:
exit(0) # 退出程序,返回狀態(tài)碼0
五、使用sys.exit()
sys.exit()是一種常用的退出當(dāng)前進(jìn)程的方法,它可以終止一個(gè)程序的運(yùn)行,并可以返回一個(gè)狀態(tài)碼。當(dāng)sys.exit()被調(diào)用時(shí),程序?qū)⒘⒓赐V箞?zhí)行,所有的finally子句(如果有的話)將被忽略,并且返回一個(gè)標(biāo)識(shí)狀態(tài)的整數(shù)。下面是使用sys.exit()方法退出程序的示例代碼:
import sys sys.exit(0) # 退出程序,返回狀態(tài)碼0
就像websocket客戶端,當(dāng)服務(wù)端主動(dòng)關(guān)閉后,客戶端直接退出:

服務(wù)端代碼:
from flask import Flask
from flask_sock import Sock
app = Flask(__name__)
sock = Sock(app)
# 創(chuàng)建全局的ws對(duì)象數(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)前進(jìn)程的PID
os.kill(pid, signal.SIGTERM)
def on_error(ws, error):
print("發(fā)生錯(cuò)誤:", 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("子線程運(yùn)行")
time.sleep(2)
def run():
t = threading.Thread(target=sub_task)
t.start()
# 啟動(dòng)WebSocket客戶端
ws.run_forever()
if __name__ == '__main__':
run()以上就是python程序主動(dòng)退出進(jìn)程的五種方式的詳細(xì)內(nèi)容,更多關(guān)于Python程序退出進(jìn)程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python實(shí)現(xiàn)括號(hào)匹配的思路詳解
這篇文章主要介紹了python實(shí)現(xiàn)括號(hào)匹配及匹配格式的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
利用python+ffmpeg合并B站視頻及格式轉(zhuǎn)換的實(shí)例代碼
這篇文章主要介紹了利用python+ffmpeg合并B站視頻及格式轉(zhuǎn)換的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
python?reshape和transpose的區(qū)別小結(jié)
reshape()?和?transpose()?是用于改變數(shù)組或張量形狀的兩種不同方法,本文主要介紹了python?reshape和transpose的區(qū)別小結(jié),具有一定參考價(jià)值,感興趣的可以了解一下2024-02-02
Python TKinter如何自動(dòng)關(guān)閉主窗口
這篇文章主要介紹了Python TKinter如何自動(dòng)關(guān)閉主窗口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
利用numpy和pandas處理csv文件中的時(shí)間方法
下面小編就為大家分享一篇利用numpy和pandas處理csv文件中的時(shí)間方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python基于tkinter實(shí)現(xiàn)gif錄屏功能
一直在思索實(shí)現(xiàn)一個(gè)透明的窗體,然后可以基于這個(gè)窗體可以開發(fā)出各種好玩的應(yīng)用,這一期,我們將實(shí)現(xiàn)有趣的GIF錄屏功能2021-05-05
Blueprint實(shí)現(xiàn)路由分組及Flask中session的使用詳解
這篇文章主要為大家介紹了Blueprint實(shí)現(xiàn)路由分組及Flask中session的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

