Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
从外部函数关闭 Python Socket 服务器_创想鸟

从外部函数关闭 Python Socket 服务器

从外部函数关闭 python socket 服务器

本文旨在提供一种在 Python 中从外部函数关闭 Socket 服务器的有效方法。通过使用线程和事件对象,我们可以创建一个在后台运行的服务器,并允许主程序在需要时安全地关闭它。本文将提供一个清晰的代码示例,并解释如何使用线程事件来控制服务器的生命周期。

在构建网络应用程序时,经常需要在后台运行一个 Socket 服务器,并能够从主程序的其他部分控制其启动和停止。一种常见的场景是,用户界面上的一个按钮触发服务器的启动,而另一个按钮则负责关闭它。由于 Socket 服务器通常在一个无限循环中运行,直接从外部关闭它可能会比较棘手。

以下介绍一种使用线程和线程事件来解决此问题的方法。

使用线程和事件对象控制 Socket 服务器

该方法的核心思想是使用一个线程来运行 Socket 服务器,并使用一个线程事件来控制该线程的生命周期。线程事件是一个简单的同步原语,它允许一个线程通知其他线程某个事件已经发生。

立即学习“Python免费学习笔记(深入)”;

以下是一个示例代码:

import socketimport threadingdef create_server(address: str, port: int, close_event: threading.Event):    """    创建一个 Socket 服务器,并在单独的线程中运行。    Args:        address: 服务器绑定的地址。        port: 服务器监听的端口。        close_event: 一个线程事件,用于通知服务器关闭。    """    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    s.bind((address, port))    s.listen(5)    print(f"Server listening on {address}:{port}")    while not close_event.is_set():        try:            conn, addr = s.accept()            print(f"Connected to {addr}!")            while conn:                data = conn.recv(1024).decode()                if data == "end":                    print(f"Closing connection from {addr}")                    conn.close()                    break # Exit the inner loop for this connection                elif data:                    print(f"Received: {data} from {addr}")                    # Process the received data here                else:                    # Connection closed by client                    print(f"Connection closed by {addr}")                    conn.close()                    break # Exit the inner loop for this connection        except socket.timeout:            # Check the event every timeout            pass        except Exception as e:            print(f"Error in server loop: {e}")            break # Exit the outer loop if an error occurs    print("Server shutting down...")    try:        s.shutdown(socket.SHUT_RDWR)    except OSError as e:        print(f"Error during shutdown: {e}")  # Handle cases where the socket might already be closed    finally:        s.close()    print("Server stopped.")def close_socket(close_event: threading.Event):    """    设置线程事件,通知 Socket 服务器关闭。    Args:        close_event: 要设置的线程事件。    """    print("Requesting server shutdown...")    close_event.set()# Example Usage:if __name__ == "__main__":    server_close_event = threading.Event()    # Set a timeout for the socket, so it doesn't block indefinitely on accept()    # This allows it to check the close_event regularly    address = "127.0.0.1"  # Loopback address for testing    port = 12345    server_thread = threading.Thread(target=create_server, args=(address, port, server_close_event))    server_thread.daemon = True # Allow the main program to exit even if the thread is still running    server_thread.start()    # Simulate some work in the main thread    import time    time.sleep(5)    # Stop the server    close_socket(server_close_event)    server_thread.join() # Wait for the server thread to finish    print("Program finished.")

代码解释:

create_server(address, port, close_event) 函数:创建一个 Socket 对象,并将其绑定到指定的地址和端口。开始监听传入的连接。在一个 while 循环中,接受连接并处理数据,直到 close_event 被设置。使用 s.shutdown(socket.SHUT_RDWR) 和 s.close() 安全地关闭 Socket。使用 try…except 块来捕获 socket.timeout 异常,允许在等待连接时定期检查关闭事件。增加了对客户端主动关闭连接的处理,避免无限循环。close_socket(close_event) 函数:设置 close_event 线程事件,通知 create_server 函数停止运行。主程序:创建一个 threading.Event 对象,用于控制服务器的生命周期。创建一个线程,并在该线程中运行 create_server 函数。调用 close_socket 函数来停止服务器。调用 server_thread.join() 等待服务器线程完成。设置 server_thread.daemon = True 允许主程序在服务器线程仍在运行时退出。设置 socket 的超时时间,避免 accept() 阻塞。

注意事项:

s.shutdown(socket.SHUT_RDWR) 用于确保所有挂起的 I/O 操作都已完成,然后再关闭 Socket。server_thread.join() 用于等待服务器线程完成。如果不调用此函数,主程序可能会在服务器线程完成之前退出,导致资源泄漏或其他问题。server_thread.daemon = True 允许主程序在服务器线程仍在运行时退出。这在某些情况下可能很有用,但请注意,如果服务器线程正在执行某些重要操作,则可能会在操作完成之前被中断。设置 socket 的超时时间,避免 accept() 阻塞,从而能及时响应关闭事件。

总结:

通过使用线程和线程事件,我们可以创建一个在后台运行的 Socket 服务器,并允许主程序在需要时安全地关闭它。这种方法简单易懂,并且可以轻松地集成到现有的应用程序中。通过以上代码示例和解释,可以帮助开发者更好地理解和应用此方法。

以上就是从外部函数关闭 Python Socket 服务器的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1368576.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
创建既能作为类型又能作为值的单例对象
上一篇 2025年12月14日 08:54:20
Python嵌套数据结构的高效遍历策略
下一篇 2025年12月14日 08:54:40

相关推荐

  • 豆包AI如何辅助Android开发?快速构建移动应用界面

    豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面豆包AI如何辅助Android开发?快速构建移动应用界面

    豆包ai在android开发中可作为高效助手,通过多种方式提升开发效率。1. 可快速生成xml布局代码,根据描述输出结构清晰的ui组件,如按钮栏、卡片列表等,并支持material design风格;2. 提供java/kotlin代码片段建议,如页面跳转、适配器编写,并解释关键逻辑;3. 推荐界面…

    2026年10月1日 • 用户投稿
    000
  • sublime如何运行前端代码 sublime执行html文件教程

    sublime如何运行前端代码 sublime执行html文件教程sublime如何运行前端代码 sublime执行html文件教程sublime如何运行前端代码 sublime执行html文件教程sublime如何运行前端代码 sublime执行html文件教程

    sublime text不能直接运行前端代码,因为它是一个文本编辑器而非集成开发环境。要运行html、css、javascript文件,需通过以下方法实现:1. 安装package control插件管理工具;2. 使用view in browser插件在浏览器中预览html文件;3. 手动配置su…

    2026年10月1日 • 用户投稿
    000
  • 如何让豆包AI处理Python中的字符串操作

    如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作如何让豆包AI处理Python中的字符串操作

    豆包ai不能运行python代码,但能辅助编写和调试字符串操作。你可以描述具体需求,如提取邮箱、替换空格等,它会提供示例代码;可提问字符串方法区别、判断纯数字、格式化方式等常见问题;还可用于检查代码逻辑,如split与正则表达式的使用建议,提升字符串处理效率。 ☞☞☞AI 智能聊天, 问答助手, A…

    2026年10月1日 • 用户投稿
    000
  • java使用教程怎样使用Redis缓存数据 java使用教程的Redis操作基础方法​

    java使用教程怎样使用Redis缓存数据 java使用教程的Redis操作基础方法​java使用教程怎样使用Redis缓存数据 java使用教程的Redis操作基础方法​java使用教程怎样使用Redis缓存数据 java使用教程的Redis操作基础方法​java使用教程怎样使用Redis缓存数据 java使用教程的Redis操作基础方法​

    redis作为缓存的优势在于其内存存储带来的高速读写、支持丰富的数据结构(如字符串、哈希、有序集合等)、具备持久化能力(rdb/aof),适用于热点数据缓存、查询结果缓存、会话管理、计数器与排行榜、消息队列等场景;2. java中选择redis客户端时,jedis简单直观适合小型项目,lettuce…

    2026年10月1日 • 用户投稿
    400
  • 一场OpenMic,聊出行业新未来

    一场OpenMic,聊出行业新未来一场OpenMic,聊出行业新未来一场OpenMic,聊出行业新未来一场OpenMic,聊出行业新未来

    近日,中国建博会(广州)媒体交流会——openmic!敞开聊!于上海成功举办,现场汇聚了澎湃新闻、财经网、1m建筑装饰沙龙学会、家居新范式、今日家居、知了home、装企炼接、薄雾馆time、家居邦、青舍qinghouse、设计时代、灵感家、卡撒传媒、智哪儿、智能头条、时尚办公网、齐家网、网易家居、中…

    2026年10月1日 • 用户投稿
    900
  • 用豆包AI解析Python中的CSV文件数据

    用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据用豆包AI解析Python中的CSV文件数据

    解析 csv 文件的核心方法包括使用 python 内置 csv 模块、pandas 进行结构化数据处理以及结合 ai 工具辅助调试和生成代码。1. 使用 csv 模块适合小规模数据,通过 reader 对象逐行读取,适用于无第三方依赖的场景;2. pandas 提供更高效的数据处理能力,支持列名识…

    2026年10月1日 • 用户投稿
    000
  • 在 Angular 14 中集成 Stripe 实现自定义支付流程

    在 Angular 14 中集成 Stripe 实现自定义支付流程在 Angular 14 中集成 Stripe 实现自定义支付流程在 Angular 14 中集成 Stripe 实现自定义支付流程在 Angular 14 中集成 Stripe 实现自定义支付流程

    本文旨在指导开发者如何在 Angular 14 项目中集成 Stripe,实现自定义的支付流程,避免使用 stripe-ngx 库的默认弹窗设计。我们将探讨如何在 Angular 组件中捕获支付成功事件,无需重定向到新的 URL,并解决使用 Stripe JS Checkout 过程中可能遇到的 c…

    2026年10月1日 • 用户投稿
    200
  • Java Properties文件:通过部分键名灵活获取配置值

    Java Properties文件:通过部分键名灵活获取配置值Java Properties文件:通过部分键名灵活获取配置值Java Properties文件:通过部分键名灵活获取配置值Java Properties文件:通过部分键名灵活获取配置值

    针对Java Properties文件加载后无法直接通过部分键名获取值的场景,本文介绍了一种实用的解决方案。通过遍历所有属性键并利用字符串匹配方法,可以灵活地根据键的子串定位到所需的值,从而满足不完全匹配的查找需求,尤其适用于键名包含多个逻辑段的情况。 理解Java Properties文件与键名匹…

    2026年10月1日 • 用户投稿
    700
  • 16GB显存在今天真的有必要吗?会不会是浪费?

    16GB显存对普通用户非必需,但高端游戏、内容创作及AI应用则有必要。追求4K高画质游戏、使用专业软件或运行大模型时,16GB显存可保障流畅体验与未来兼容性,是否需要取决于具体用途。 16GB显存在今天是否必要,取决于你用电脑做什么。对多数普通用户来说,这确实可能用不上那么多,但对特定人群而言,它不…

    2026年10月1日
    100
  • 灵活查找:Java Properties 文件中基于部分键的数值获取策略

    灵活查找:Java Properties 文件中基于部分键的数值获取策略灵活查找:Java Properties 文件中基于部分键的数值获取策略灵活查找:Java Properties 文件中基于部分键的数值获取策略灵活查找:Java Properties 文件中基于部分键的数值获取策略

    在Java开发中,当需要从java.util.Properties文件中根据键获取值时,通常要求提供精确的键名。然而,面对仅知部分键信息(如键的一部分子字符串)的场景,标准方法无法直接满足需求。本文将详细介绍一种实用的解决方案:通过遍历所有属性键并结合字符串匹配方法,实现对部分键的灵活查找与值获取,…

    2026年10月1日 • 用户投稿
    200
  • 电脑系统怎么用BIOS恢复到出厂设置的详细教程

    电脑系统怎么用BIOS恢复到出厂设置的详细教程电脑系统怎么用BIOS恢复到出厂设置的详细教程电脑系统怎么用BIOS恢复到出厂设置的详细教程电脑系统怎么用BIOS恢复到出厂设置的详细教程

    大家在使用电脑的过程中,难免会遇到各种系统问题,严重时甚至会导致系统崩溃,无法正常进入操作系统。如果你觉得重装系统太繁琐,不想借助第三方装机工具来解决问题,那么不妨试试一种更为快捷的方法——通过bios将电脑恢复到出厂默认设置。接下来,就让小编带你详细了解具体操作步骤。 1、首先将电脑关机,然后重新…

    2026年10月1日 • 用户投稿
    100
  • 使用 Angular 14 实现 Stripe 自定义支付流程

    使用 Angular 14 实现 Stripe 自定义支付流程使用 Angular 14 实现 Stripe 自定义支付流程使用 Angular 14 实现 Stripe 自定义支付流程使用 Angular 14 实现 Stripe 自定义支付流程

    本文将介绍如何在 Angular 14 项目中集成 Stripe 支付,并实现自定义支付流程,避免使用 stripe-ngx 库及其默认弹窗样式。我们将重点讲解如何在 Angular 组件中捕获支付成功事件,避免页面跳转,以及解决使用 Stripe JS checkout 时可能遇到的 client…

    2026年10月1日 • 用户投稿
    100
  • 解决SublimeText中文输入不流畅的问题

    解决SublimeText中文输入不流畅的问题解决SublimeText中文输入不流畅的问题解决SublimeText中文输入不流畅的问题解决SublimeText中文输入不流畅的问题

    解决sublimetext中文输入不流畅问题的方法有三种:1. 调整用户设置文件,将auto_complete_delay设置为50毫秒,auto_complete_size_limit设置为4194304字节;2. 安装chineseinput插件,通过package control搜索并安装,输…

    2026年10月1日 • 用户投稿
    100
  • 热搜第一!小米汽车紧急召回11万辆SU7,事关辅助驾驶功能

    热搜第一!小米汽车紧急召回11万辆SU7,事关辅助驾驶功能热搜第一!小米汽车紧急召回11万辆SU7,事关辅助驾驶功能热搜第一!小米汽车紧急召回11万辆SU7,事关辅助驾驶功能热搜第一!小米汽车紧急召回11万辆SU7,事关辅助驾驶功能

    图源:微博 9月19日,备受关注的小米汽车宣布启动一项大规模召回计划,迅速引发行业热议。 具体情况如何?一起来了解下。 根据国家市场监督管理总局官网发布的消息,小米汽车科技有限公司依据《缺陷汽车产品召回管理条例》及相关实施办法,已向主管部门备案召回方案。自即日起,将对2024年2月6日至2025年8…

    2026年10月1日 • 用户投稿
    100
  • 分享自己的SublimeText使用经验和技巧

    分享自己的SublimeText使用经验和技巧分享自己的SublimeText使用经验和技巧分享自己的SublimeText使用经验和技巧分享自己的SublimeText使用经验和技巧

    sublime text的核心功能包括命令面板、多光标编辑、goto anything和代码片段。命令面板通过可搜索命令提升操作效率;多光标编辑支持同时在多个位置修改内容;goto anything实现快速文件与符号跳转;代码片段减少重复输入并降低错误率。这些功能共同构建了高效流畅的开发体验。 对我…

    2026年10月1日 • 用户投稿
    200
  • DynamoDB海量数据高效查询策略

    DynamoDB海量数据高效查询策略DynamoDB海量数据高效查询策略DynamoDB海量数据高效查询策略DynamoDB海量数据高效查询策略

    在Spring Boot REST API中从DynamoDB高效获取海量数据是一项挑战,尤其要避免将所有数据加载到内存中。DynamoDB单次请求最大返回1MB数据,因此处理大量数据需采用分页机制。应极力避免对大型数据集使用Scan操作,因为它不具伸缩性且成本高昂,建议重新审视业务需求或考虑更适合…

    2026年10月1日 • 用户投稿
    100
  • 荣耀Magic8系列搭载全新青海湖电池 更有新电池算法

    10月15日,荣耀将召开新品发布会,正式发布全新荣耀magic8系列手机及magicos 10操作系统。在发布会前夕,荣耀持续释放产品核心亮点。12日上午,官方宣布荣耀magic8系列将搭载新一代青海湖电池,并行业首发毫伏级ai稳压算法,实现典型场景下功耗降低13%,让用户全天使用更加省电安心。 根…

    2026年10月1日
    000
  • MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略

    MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略MySQL怎样导出数据到文件 CSV/Excel格式导出全攻略

    mysql导出数据到文件的方法主要包括命令行方式、select…into outfile语句、mysqldump命令、图形化工具及编程语言连接数据库。1. 命令行方式通过mysql命令执行查询并将结果输出至文件,可结合sed替换分隔符;2. select…into outfi…

    2026年10月1日 • 用户投稿
    100
  • 如何在Java中通过key获取Map值

    使用get()方法通过key获取Map值,若key不存在则返回null,需结合containsKey()判断以避免空指针;遍历多个key时可用循环处理;使用泛型可提升类型安全和可读性。 在Java中通过key获取Map值,最常用的方式是使用Map接口提供的get(Object key)方法。只要知道…

    2026年10月1日
    100
  • 一站式免费PPT制作 免费在线幻灯片编辑网址

    一站式免费PPT制作 免费在线幻灯片编辑网址一站式免费PPT制作 免费在线幻灯片编辑网址一站式免费PPT制作 免费在线幻灯片编辑网址一站式免费PPT制作 免费在线幻灯片编辑网址

    AI生成类工具如笔灵PPT、Pi和轻竹Office可一键生成完整PPT,适合快速出稿;模板编辑类如OfficePlus、优品PPT、PPTFans提供在线修改与海量资源,自由度更高;集成平台如亿图脑图支持从思维导图转PPT,适配深度创作需求。 想找一个能从头到尾帮你搞定PPT的免费在线工具?现在确实…

    2026年10月1日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信