python 多进程

Windows上的Python多进程 Python Multiprocessing on Windows 因为众所周知的GIL(全局解释器锁),在Python上实现真正的并发只能通过python multiprocessing。但是在Windows上,运用python multiprocessing并没有在Linux那么简单。 if __name__ == "__main__": 也许大家有些在Linux跑的很好的多进程的程序,在Windows上一跑就会经常遇到这些错误的信息 “An attempt has been made to start 阅读详情
import multiprocessing
import time
import random
from typing import Dict, List, Tuple


# ===================== 模拟USB设备通信(可替换为真实USB库) =====================
class USBDeviceSimulator:
    """模拟USB设备(真实场景替换为pyusb/pyserial等库的调用)"""

    def __init__(self, device_id: str):
        self.device_id = device_id  # 设备唯一标识(如USB端口号/设备SN)
        self.is_connected = False

    def connect(self) -> bool:
        """连接USB设备(真实场景:打开USB端口/建立通信)"""
        try:
            # 模拟连接耗时与随机失败(真实场景:调用USB库的连接接口)
            time.sleep(random.uniform(0.1, 0.3))
            self.is_connected = random.choice([True] * 9 + [False])  # 90%连接成功率
            print(f"[设备{self.device_id}] 连接{'成功' if self.is_connected else '失败'}")
            return self.is_connected
        except Exception as e:
            print(f"[设备{self.device_id}] 连接异常: {str(e)}")
            self.is_connected = False
            return False

    def send_command(self, cmd: str) -> str:
        """发送指令到USB设备(真实场景:USB数据发送)"""
        if not self.is_connected:
            return "ERROR: 设备未连接"

        try:
            # 模拟指令处理耗时
            time.sleep(random.uniform(0.05, 0.2))
            # 模拟不同指令的响应(产测常用指令示例)
            cmd_responses = {
                "GET_VERSION": f"VERSION:V1.0.{self.device_id}",
                "TEST_LED": "LED:OK",
                "TEST_USB_SPEED": f"SPEED:{random.choice(['HIGH', 'FULL'])}",
                "TEST_COMM": "COMM:OK"
            }
            # 模拟10%指令响应失败(真实场景:校验USB返回的原始数据)
            if random.random() < 0.1:
                return f"ERROR: {cmd}响应超时"
            return cmd_responses.get(cmd, f"UNKNOWN_CMD:{cmd}")
        except Exception as e:
            return f"ERROR: {str(e)}"

    def disconnect(self):
        """断开USB设备(真实场景:关闭USB端口)"""
        self.is_connected = False
        print(f"[设备{self.device_id}] 断开连接")


# ===================== 单设备测试进程 =====================
def device_test_worker(
        device_id: str,
        task_queue: multiprocessing.Queue,
        result_queue: multiprocessing.Queue
):
    """
    单个USB设备的测试进程
    :param device_id: 设备唯一标识
    :param task_queue: 主进程下发的任务队列
    :param result_queue: 子进程回传的结果队列
    """
    # 初始化设备
    usb_device = USBDeviceSimulator(device_id)
    test_result = {
        "device_id": device_id,
        "connect_status": False,
        "test_items": {},
        "total_pass": False,
        "error_msg": ""
    }

    try:
        # 1. 连接设备
        test_result["connect_status"] = usb_device.connect()
        if not test_result["connect_status"]:
            test_result["error_msg"] = "设备连接失败"
            result_queue.put(test_result)
            return

        # 2. 执行产测指令(从任务队列获取测试项)
        while not task_queue.empty():
            test_item = task_queue.get()
            if test_item == "EXIT":  # 退出信号
                break

            # 发送测试指令并记录结果
            response = usb_device.send_command(test_item)
            test_result["test_items"][test_item] = {
                "response": response,
                "pass": "ERROR" not in response  # 简单校验:无ERROR即为通过
            }

        # 3. 判定整体测试结果
        test_result["total_pass"] = all([item["pass"] for item in test_result["test_items"].values()])
        test_result["error_msg"] = "" if test_result["total_pass"] else "部分测试项失败"

    except Exception as e:
        test_result["error_msg"] = f"测试异常: {str(e)}"
        test_result["total_pass"] = False
    finally:
        # 4. 清理资源并返回结果
        usb_device.disconnect()
        result_queue.put(test_result)
        print(f"[设备{device_id}] 测试进程结束")


# ===================== 主进程(上位机控制逻辑) =====================
class USBTestHost:
    """产测上位机主控制类(一托多USB设备测试)"""

    def __init__(self, device_ids: List[str]):
        self.device_ids = device_ids  # 待测试的USB设备ID列表
        self.task_queues: Dict[str, multiprocessing.Queue] = {}  # 每个设备的任务队列
        self.result_queue = multiprocessing.Queue()  # 所有设备的结果队列
        self.processes: Dict[str, multiprocessing.Process] = {}  # 设备对应的进程

    def init_tasks(self, test_items: List[str]) -> None:
        """初始化每个设备的测试任务队列"""
        for dev_id in self.device_ids:
            task_queue = multiprocessing.Queue()
            # 放入测试项
            for item in test_items:
                task_queue.put(item)
            # 放入退出信号(所有任务执行完后退出)
            task_queue.put("EXIT")
            self.task_queues[dev_id] = task_queue

    def start_test(self) -> List[Dict]:
        """启动所有设备的测试进程"""
        # 1. 初始化测试任务(产测指令列表)
        test_items = ["GET_VERSION", "TEST_LED", "TEST_USB_SPEED", "TEST_COMM"]
        self.init_tasks(test_items)

        # 2. 启动每个设备的测试进程
        print(f"\n===== 启动{len(self.device_ids)}台USB设备测试 =====")
        for dev_id in self.device_ids:
            p = multiprocessing.Process(
                target=device_test_worker,
                args=(dev_id, self.task_queues[dev_id], self.result_queue)
            )
            self.processes[dev_id] = p
            p.start()
            print(f"[主进程] 设备{dev_id}测试进程已启动 (PID:{p.pid})")

        # 3. 等待所有进程结束并收集结果
        test_results = []
        for dev_id, p in self.processes.items():
            p.join(timeout=10)  # 设置超时,避免进程卡死
            if p.is_alive():
                p.terminate()  # 超时终止进程
                test_results.append({
                    "device_id": dev_id,
                    "connect_status": False,
                    "test_items": {},
                    "total_pass": False,
                    "error_msg": "测试进程超时"
                })

        # 4. 从结果队列获取所有测试结果
        while not self.result_queue.empty():
            test_results.append(self.result_queue.get())

        return test_results

    def print_test_summary(self, results: List[Dict]) -> None:
        """打印测试汇总报告"""
        print("\n===== USB设备产测汇总报告 =====")
        total_devices = len(results)
        pass_devices = sum([1 for res in results if res["total_pass"]])
        connect_fail = sum([1 for res in results if not res["connect_status"]])

        print(f"测试总数: {total_devices} 台")
        print(f"通过数: {pass_devices} 台")
        print(f"连接失败: {connect_fail} 台")
        print(f"通过率: {pass_devices / total_devices * 100:.1f}%")

        # 打印每台设备的详细结果
        for res in results:
            print(f"\n--- 设备{res['device_id']} ---")
            print(f"连接状态: {'成功' if res['connect_status'] else '失败'}")
            print(f"整体结果: {'PASS' if res['total_pass'] else 'FAIL'}")
            if res["error_msg"]:
                print(f"错误信息: {res['error_msg']}")
            # 打印各测试项结果
            for test_item, item_res in res["test_items"].items():
                print(f"  {test_item}: {item_res['response']} ({'PASS' if item_res['pass'] else 'FAIL'})")


# ===================== 运行示例 =====================
if __name__ == "__main__":
    # 模拟5台USB设备(真实场景:枚举系统中的USB设备,获取设备ID/端口号)
    device_ids = ["USB-001", "USB-002", "USB-003", "USB-004", "USB-005"]

    # 初始化上位机并启动测试
    test_host = USBTestHost(device_ids)
    test_results = test_host.start_test()

    # 打印测试汇总
    test_host.print_test_summary(test_results)
通义千问AI模型对接飞书机器人-集成飞书机器人(2-2) http请求地址上一篇百炼平台配置的应用地址。 阅读详情

相关推荐

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2066

Python多进程

单进程示例 举例一个吃饭活动,有一碗汤和一碗饭,正常操作是一口饭一口汤(当然你先把汤或者饭一口气吃完,当我无话可说)。单进程只能是先吃完饭,再喝汤;或者是先喝完汤,再吃饭。 看代码 import time def drink(): for i in range(3): print("喝汤……") time.sleep(1) def eat(): for i in range(3): print("吃饭……") time

帅帅气气的黑猫警长 4万+

设计一个订单管理系统(OMS)系统100问?

一个完善的订单管理系统不仅仅是简单地记录和处理订单信息,更需要考虑到订单的全生命周期管理,包括订单的创建、支付、配送、售后等环节。这100个问题围绕订单管理系统(OMS)的各个方面展开,涵盖了系统的功能、架构、安全性、异常处理、订单处理流程、支付、库存管理、客户管理、报表与分析等多个方面。通过这些问题,可以全面考虑订单管理系统在设计与实现过程中需要考虑的各种因素,从而确保系统能够满足业务需求、具有良好的性能和稳定性,同时易于扩展、维护和管理。

nbsaas-boot基于Request-Response的企业级快速开发框架 1384

Python 多进程好很多

摘要:Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用g

Teman的博客 5278

Android Profiler 帧率优化实战与性能调优

本文详细介绍了使用Android Profiler进行帧率优化与性能调优的实战方法。通过分析主线程状态、FPS曲线和渲染阶段耗时,精准定位卡顿根源,并提供减少过度绘制、优化绘制命令及改善资源使用的具体策略。文章结合电商、游戏等真实案例,帮助开发者有效解决卡顿问题,提升应用流畅度。

palm99的专栏 537

Mac上快速部署DeepSeek模型:Ollama终端操作全指南

本文详细介绍了在Mac上使用Ollama终端快速部署DeepSeek模型的完整指南。从硬件要求、Ollama安装、模型下载运行,到高级配置、可视化界面及常见问题解决,提供了全流程操作步骤与优化技巧,帮助开发者高效搭建本地AI助手,实现稳定、私密的离线使用体验。

weixin_29251567的博客 555

【Python】python中多进程处理

python中多进程相关简单介绍

sinat_41752325的博客 2971

UR5双臂Gazebo仿真(Python)

近来在Gazebo上搭了一个ur5双臂仿真平台。 差不多就是以下这样。 使用rostopic list查看一下话题,如下 显然,采用/left_arm_controller/follow_joint_trajectory/goal和/right_arm_controller/follow_joint_trajectory/goal两个话题来控制双臂的运动。 现在的问题是,如何保证双臂运动的一致性,即如何能保证双臂能同时接受到以上两个消息。 思路一:设置/left_arm_controlle

qq_42823342的博客 2233

python实现多进程

在这里用Python程序来实现多进程并加深对多进程并发的理解

u014556057的专栏 3万+

2. Android_逆向的历史与发展

学完本节,希望你能够:了解 Android 逆向工程的发展历程,从早期 APK 破解到现代应用保护;入门先把这几类「在干啥」搞清楚,后面学脱壳、反反调试会顺很多。(反编译 APK 得到的类汇编代码,相当于程序的「菜谱」)就能绕过验证,到后来混淆、加固、反调试一起上,逆向难度越来越高。(第三节 什么是 CPU 指令集),帮你搞清楚「反汇编看到的那些指令」是从哪来的、和 Android 逆向有啥关系。有必要——先搞清「没加固时怎么玩」,再学脱壳和对抗,思路才顺。读起来费劲,但逻辑还在,耐心一点还能跟。

长沙火山 1391

【ROS2实体机械臂驱动】封装珞石ROS2驱动库ros2_rokae_driver_lib

这一篇文章将封装为,和之前一篇文章《ROS2 编译、打包、封装三方库(Knet为例)_ros插件编译成静态库-优快云博客》写的封装,区别在于优化了cmake dependencies和include等属性和宏定义,同时对于多库内部依赖的情况做了特定处理,更加方便外部调用。其中珞石的编译参考博主之前的文章rokae xCoreSDK C++测试使用,这里不再做赘述。通过这篇文章对于如何打包机械臂厂家提供的三方库做了进一步说明,方便用于不同机械臂厂家的三方库封装调用。!!

机器人梦想家 Bing Lee 1400

python多进程,python multiprocessing 多进程使用方法

python多进程使用,python multiprocessing使用方法

村中少年的专栏 2079

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

python多进程的理解,多进程读写公共数据,多进程并行,

1. 多进程读写公共数据,多进程并行 #公共数据 temp = np.zeros((4,12)) # 回调函数,用于多进程读写公共数据的,我的理解:多进程在回调函数这里是串行的,否则同时读写会乱掉 # 回调函数必须只有一个输入参数 def mycallback(index): i,j = index[0],index[1] temp[i,j] = i+j # 多进程处理的耗时的算法...

weixin_41457494的博客 1716

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Python 中的多进程

本文简要而简洁地介绍了Python编程语言中的多进程。 什么是多进程?为什么选择多进程?python中的多进程是如何实现的,以及模拟多进程运行方式的方法

a883774913的博客 1875

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python多进程反而慢_python 多进程使用总结

python中的多进程主要使用到multiprocessing 这个库。这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级到高版本python,如2.7.11,可具体参考《python版本升级》。python使用线程池可参考《python线程池实现》一、多进程使用1、linux下可使用 fork 函数#!/bin/env pythonimport...

weixin_39535557的博客 1744

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

python中多进程终止_Python中的多进程

一、python并发编程之多进程1、multiprocessing模块介绍(from multiprocessing import Process)2、Process类的介绍1 创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)强调:1. 需要使用关键字的方式来指...

weixin_39536630的博客 2393

python多进程_python多进程

上一期我们讲了python中多线程的使用,忘记的小伙伴请戳链接复习,https://zhuanlan.zhihu.com/p/262638052。还记得我们说到,多线程并不是真正的并发,只是充分利用了等待时间,所以当遇到CPU密集型的任务时,多线程就力不从心了,这时候要请出本文的主角多进程。多进程的使用方法和上一期多线程极为相似,实际上在multiprocessing库中多线程只是在多进程的基础上...

weixin_39719042的博客 164

python多进程调试_Python多进程应用

由于GIL的存在,使得python多线程没有充分利用CPU的多核,为了利用多核,可以采用多进程;1.父进程与子进程wiki上对于父进程与子进程的定义:a)Parent processInUnix-likeoperating systems, every process exceptprocess 0(the swapper) is created when another process ...

weixin_39849942的博客 577

python多进程_为什么我建议你用 Python 多进程?

(点击上方快速关注并设置为星标,一起学Python)文 | 饒木陽Python 是运行在解释器中的语言,查找资料知道, python 中有一个全局锁( GI),在使用多线程( MultiThread)的情况下,不能发挥多核的优势。而使用多进程( Multiprocess),则可以发挥多核的优势真正地提高效率。对比实验资料显示,如果多线程的进程是 CPU 密集型的,那多线程并不能有多少效率...

weixin_39663605的博客 576

python 多进程 requests_Python多进程

在Python中如果想创建多进程需要用到multiprrocessing中的Prrocess方法。在进程之间全局变量是不共享的,如果要对进程的全局变量进行使用的话就需要用到multiprrocessing的Queue方法首先我们先创建一个多进程importtimefrom multiprocessing importProcess#进程之间全局变量不共享defwork_1():for i in r...

weixin_39757040的博客 434

python多进程关闭_python多进程操作实例

由于CPython实现中的GIL的限制,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况我们需要使用多进程。 这也许就是python中多进程类库如此简洁好用的原因所在。在python中可以向多线程一样简单地使用多进程。一、多进程process的成员变量和方法:>>class multiprocessing.Process([g...

weixin_39812577的博客 989

python 多进程_python 多进程

Python的多线程只能运行在单核上,各个线程以并发的方法异步运行。而多进程可以利用CPU的多核,进程数取决于计算机CPU的处理器个数,由于运行在不同的核上,各个进程的运行是并行的。在python中,如果使用多进程,需要使用multiprocessing这个库。multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接...

weixin_39858132的博客 224
上一篇: python socket
下一篇: C++成员变量的初始化顺序由它们在类中的声明顺序决定,而不是初始化列表中的顺序
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值