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

news2024/12/23 20:21:22

一、使用os.kill()

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

import os

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

二、使用os._exit()

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

import os

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()方法退出程序的示例代码:

import sys

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

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

服务端代码:

from flask import Flask
from flask_sock import Sock

app = Flask(__name__)
sock = Sock(app)
# 创建全局的ws对象数组
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)
    # 同步消息和关闭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)
        # 同步消息和关闭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("连接已建立")
    # 发送消息给服务器
    ws.send("Hello, server!")


def on_message(ws, message):
    print("收到消息:", message)


def on_close(ws, arg1, arg2):
    print("连接已关闭")
    pid = os.getpid()  # 获取当前进程的PID
    os.kill(pid, signal.SIGTERM)


def on_error(ws, error):
    print("发生错误:", error)


# 创建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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【办公自动化】用Python将PDF文件转存为图片(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【Java SE】反射与枚举

目录 ♫反射 ♪什么是反射 ♪与反射相关的类 ♪什么是Class类 ♪获取Class类 ♪class类的常用方法 ♪反射的使用 ♪反射私有方法 ♪反射的优缺点 ♫枚举 ♪什么是枚举 ♪枚举的常用方法 ♪枚举的构造方法 ♫枚举与反射 ♫反射 ♪什么是反射 Java反射是Java语言的一…

【VUE复习·1】单向数据绑定v-bind;双向数据绑定v-model

总览 1.单向数据绑定&#xff1a;v-bind 2.双向数据绑定&#xff1a;v-model 一、v-bind 单向数据绑定 1.图解 data 中的值能够影响页面上的值&#xff0c;但是在页面上更改却不能影响 data 中的值。 2.用法说明 <div><input v-bind:value"name">&l…

ES查询数据的时报错:circuit_breaking_exception[[parent] Data too large

ES配置的官方网站&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/7.2/circuit-breaker.html 报错&#xff1a; circuit_breaking_exception[[parent] Data too large, data for [<transport_request>] would be [12318476937/11.2gb], which is…

Vue之ElementUI之动态树+数据表格+分页(项目功能)

目录 前言 一、实现动态树形菜单 1. 配置相应路径 2. 创建组件 3. 配置组件与路由的关系 index.js 4. 编写动态树形菜单 5. 页面效果演示 二、实现数据表格绑定及分页功能 1. 配置相应路径 2. 编写数据表格显示及分页功能代码 BookList.vue 3. 演示效果 总结 前言…

数据结构 - 泛型

目录 前言 1. 什么是泛型? 2. 为什么需要泛型? 引入泛型之前 引入泛型之后 3.泛型类 4.泛型的界限 1.上下界 2.通配符 前言 今天给大家介绍一下泛型的使用 1. 什么是泛型? 一般的类和方法&#xff0c;只能使用具体的类型: 要么是基本类型&#xff0c;要么是自定义…

抖音短视频seo矩阵系统源代码开发系统架构及功能解析

短视频seo源码&#xff0c;短视频seo矩阵系统底层框架上支持了从ai视频混剪&#xff0c;视频批量原创产出&#xff0c;云存储批量视频制作&#xff0c;账号矩阵&#xff0c;视频一键分发&#xff0c;站内实现关键词、短视频批量搜索排名&#xff0c;数据统计分类多功能细节深度…

在多台服务器上运行相同命令(二)、clush

介绍安装配置互信认证参数含义基本使用节点组拷贝文件 介绍 Clush&#xff08;Cluster Shell&#xff09;是一个用于管理和执行集群操作的工具&#xff0c;它允许你在多台远程主机上同时执行命令&#xff0c;以便批量管理服务器。Clush 提供了一种简单而强大的方式来管理大规模…

MySQL:远程连接数据库(2)

环境 两台centos7 其中一台安装MySQL数据库 192.168.254.1 另外一台安装mariadb最小化安装mysql仅供MySQL连接 或者安装完整版mysql也是可以的&#xff0c;只要支持mysql命令即可 192.168.254.2 开始部署 我们如果让那个用户可以远程连接&…

一步解决Android Studio没有提示的问题

问题 我们在使用安卓开发软件的时候常常会遇到没有提示或提示不全的情况&#xff0c;这样会很影响我们的学习效率,接下来我来教大家快速解决这个问题 解决办法 应用完成后点击ok&#xff0c;提示就可以出来了 如果有适配的版本到这里就可以了&#xff0c;没有的话可以继续往下看…

怎么删除文件夹?这才是正确操作方法!

“作为一名电脑小白&#xff0c;想问问大家&#xff0c;我想把文件夹一整个删除&#xff0c;但是没法操作是为什么呀&#xff1f;应该怎么正确删除文件夹呢&#xff1f;求解答&#xff01;” 在电脑使用过程中&#xff0c;有时我们需要删除不再需要的文件夹以释放磁盘空间或整理…

ISP图像信号处理——白平衡校正和标定介绍以及C++实现

从数码相机直接输出的未经过处理过的RAW图到平常看到的JEPG图有一系列复杂的图像信号处理过程&#xff0c;称作ISP&#xff08;Image Signal Processing&#xff09;。这个过程会经过图像处理和压缩。 参考文章1&#xff1a;http://t.csdn.cn/LvHH5 参考文章2&#xff1a;htt…

打造综合性品牌阵地 阿里元境引领元宇宙营销创新升级

9月21日&#xff0c;由中国商务广告协会主办&#xff0c;中国商务广告协会元宇宙营销应用研究工作委员会、南京大学中德社会计算研究所、南京大学中德数字营销实验室联合主办的“聚力共生”元宇宙学术及商业应用论坛启幕。阿里元境副总经理、市场负责人史敏君出席了论坛“多元聚…

SSE 推送技术

1、简介 Server-Sent Events&#xff08;SSE&#xff09;技术&#xff0c;它是一种用于实现服务器向客户端实时单向推送数据的Web技术。 SSE基于HTTP协议&#xff0c;允许服务器将数据以事件流&#xff08;Event Stream&#xff09;的形式发送给客户端。客户端通过建立持久的HT…

一些数学公式的几何意义

三角函数平方和公式&#xff1a; 三角函数中的平方和公式有三个形式&#xff1a; 第一种&#xff1a;&#xff1b; 接着两边同时除以可以得到第二种&#xff1a;; 或第一种同时除以可以得到第三种&#xff1a;。 首先我们做一个单位圆&#xff0c;我们学三角函数的时候应该…

当两界交汇:前端开发、后端开发与全栈开发的对比与选择

编程世界就像一座大城市&#xff0c;前端开发和后端开发就像城市的两个不同街区。在这两个街区&#xff0c;前端和后端开发都有自己的价值和机会。 一、引言 有些人更喜欢在前端创造令人印象深刻的用户界面&#xff0c;而有些人更喜欢处理数据和系统逻辑。在选择时&#xff…

Topaz Gigapixel AI6.3.2(图片无损放大)

Topaz Gigapixel AI是一款功能实用的图像无损放大工具。它的特色之处在于&#xff0c;通过使用先进的深度学习方法&#xff0c;它能够将照片放大高达600%&#xff0c;同时完美保留图像的质量。 此外&#xff0c;Topaz Gigapixel AI还具有一些其他的特色功能。 它能自动进行面…

ABB DDC779BE02 3BHE006805R0002 控制主板模块

ABB DDC779BE02 3BHE006805R0002 控制主板模块用于自动化和控制系统中&#xff0c;它们可能具有以下一些常见特点和功能&#xff1a; 处理能力&#xff1a;ABB DDC779BE02 3BHE006805R0002 控制主板模块通常具有强大的处理能力&#xff0c;可以执行复杂的控制算法和逻辑。 多种…

软件测试之网站测试怎么做?有什么作用?

网站测试是指对一个已经搭建好的网站进行功能、性能、安全等方面的测试。作为一家专注于软件测试的公司&#xff0c;我们清楚地知道网站测试在整个软件开发过程中的重要性。   一、网站测试怎么做?   1、确保测试环境的稳定和一致性&#xff0c;包括操作系统、浏览器版本等…

AnV-X6使用及总结

目录 1 简介2 安装3 基础概念3.1 画布Graph3.2 基类Cell3.3 节点Node3.4 边Edge 4 使用4.1 创建节点4.2 节点连线4.3 事件系统 5 总结 1 简介 AntV是一个数据可视化&#xff08;https://x6.antv.antgroup.com/&#xff09;的工具&#xff08;https://antv.vision/zh/ &#xf…