0

0

Python多进程处理并发TCP请求导致客户端卡死的原因是什么?

聖光之護

聖光之護

发布时间:2025-03-17 09:32:10

|

523人浏览过

|

来源于php中文网

原创

Python多进程处理并发TCP请求导致客户端卡死的解决方案

本文分析并解决使用python多进程处理并发tcp请求时,客户端在macos系统上卡死的问题(在ubuntu系统上运行正常)。问题根源在于服务端在多进程环境下直接共享socket.socket对象,导致资源竞争。

Python多进程处理并发TCP请求导致客户端卡死的原因是什么?

原始代码直接在进程池中处理socket.socket对象,这并非线程安全操作。不同操作系统对这种资源竞争的处理方式不同,因此导致macOS系统出现卡死,而Ubuntu系统正常运行。

解决方案:避免进程间共享socket.socket对象

改进后的服务端代码通过以下步骤解决问题:

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

  1. 使用文件描述符: serversocket.accept()返回的clientsocket是一个socket对象。 通过clientsocket.fileno()获取其对应的文件描述符,文件描述符是进程安全的。

    PpcyAI
    PpcyAI

    泡泡次元AI-游戏美术AI创作平台,低门槛上手,高度可控,让你的创意秒速落地

    下载
  2. 进程内创建socket: 在子进程中,使用socket.fromfd()函数根据文件描述符重新创建一个socket对象,确保每个子进程拥有独立的socket对象,避免资源竞争。

  3. 关闭文件描述符:start_request函数中,使用os.close(clientsocket_fd)关闭进程池传入的文件描述符,防止资源泄漏。

  4. finally语句: start_request函数使用finally语句确保无论是否发生异常,都能正确关闭socket连接,释放资源。

改进后的代码:

import os
import socket
import sys
import time
import threading
from loguru import logger
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures._base import Future
import multiprocessing

default_encoding: str = 'utf-8'

# ... (init_serversocket function remains unchanged) ...

def send_response(clientsocket: socket.socket, addr: tuple, response_body: bytes) -> int:
    send_len: int = clientsocket.send(response_body)
    clientsocket.close()
    return send_len

def start_request(clientsocket_fd: int, addr: tuple) -> int:
    clientsocket = socket.fromfd(clientsocket_fd, socket.AF_INET, socket.SOCK_STREAM)
    os.close(clientsocket_fd)  # Close the FD after duplication

    try:
        pid = os.getpid()
        logger.debug(f'pid: {pid}, get message from {addr}')
        request_body: bytes = clientsocket.recv(2048)
        request_text: str = request_body.decode(encoding=default_encoding)
        response_text: str = f'server get message: {request_text}'
        response_body: bytes = response_text.encode(default_encoding)
        send_len = send_response(clientsocket, addr, response_body)
        logger.debug(f'发送了响应')
        return send_len
    except Exception as error:
        logger.exception(error)
    finally:
        clientsocket.close() # Ensure closure even if exceptions occur


def worker_process(clientsocket_fd, addr):
    start_request(clientsocket_fd, addr)

# ... (rest of the code remains largely unchanged) ...

通过以上修改,服务端能够正确处理并发TCP请求,避免客户端卡死。关键在于正确处理多进程环境下socket对象的共享问题,避免资源竞争和死锁。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

523

2023.08.10

macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

342

2025.05.09

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

816

2023.10.27

ubunt上安装和配置vnc
ubunt上安装和配置vnc

安装方法:安装VNC服务器、启动VNC服务器、设置VNC密码等等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

414

2023.12.28

ubuntu启动黑屏解决方法
ubuntu启动黑屏解决方法

ubuntu启动黑屏解决方法:检查是否是电源问题、检查内存是否接触不良、检查显卡问题等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

661

2023.12.28

为什么ubuntu有网络连接但不能上网
为什么ubuntu有网络连接但不能上网

ubuntu有网络连接但不能上网的原因:1、dns配置问题;2、代理服务器设置问题;3、网络防火墙设置问题;4、路由器或调制解调器设置问题;5、网络驱动程序问题;6、网络配置文件问题;7、其他问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

460

2024.09.05

ubuntu安装golang
ubuntu安装golang

本专题整合了ubuntu安装golang所有方法汇总,阅读下面的文章了解更多详细操作。

109

2025.12.13

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号