当前位置: 首页 > article >正文

MicroPython 开发ESP32应用教程 之 线程介绍及实例分析

MicroPython ESP32 线程(Thread)基础

MicroPython 在 ESP32 上支持线程(Thread)功能,通过 _thread 模块实现。线程允许程序并发执行多个任务,适合处理需要同时运行的场景,例如传感器数据采集和网络通信。

线程模块导入与基本方法

_thread 模块提供线程管理的核心功能。需注意 MicroPython 的线程实现可能因硬件和固件版本不同而有所差异。

import _thread
import timedef thread_function(name):for i in range(5):print("Thread {}: Count {}".format(name, i))time.sleep(1)_thread.start_new_thread(thread_function, ("Thread-1",))

运行结果:

Thread Thread-1: Count 0
Thread Thread-1: Count 1
Thread Thread-1: Count 2
Thread Thread-1: Count 3
Thread Thread-1: Count 4

 

线程同步与锁机制

多线程操作共享资源时需使用锁(Lock)避免竞争条件。_thread 模块提供简单的锁实现。

lock = _thread.allocate_lock()
shared_data = 0def safe_increment():global shared_datawith lock:shared_data += 1print("Shared data:", shared_data)_thread.start_new_thread(safe_increment, ())

运行结果:Shared data: 1

ESP32 线程实例分析

以下实例展示如何在 ESP32 上使用线程处理传感器数据上传和 LED 控制:

import _thread
import time
from machine import Pinled = Pin(2, Pin.OUT)  # ESP32 板载 LED
data_lock = _thread.allocate_lock()
sensor_data = []def sensor_thread():while True:simulated_data = time.ticks_ms()  # 模拟传感器数据with data_lock:sensor_data.append(simulated_data)time.sleep(0.5)def network_thread():while True:with data_lock:if sensor_data:print("Uploading data:", sensor_data.pop(0))time.sleep(1)def led_thread():while True:led.value(not led.value())time.sleep(0.2)_thread.start_new_thread(sensor_thread, ())
_thread.start_new_thread(network_thread, ())
_thread.start_new_thread(led_thread, ())

线程注意事项

ESP32 的 MicroPython 线程存在以下限制:

  • 线程数量受内存限制
  • 全局解释器锁(GIL)可能导致并非真正的并行
  • 异常处理需谨慎,未捕获的异常可能导致线程崩溃

以下代码展示如何增强线程健壮性:

def robust_thread():try:while True:# 线程主要逻辑time.sleep(1)except Exception as e:print("Thread error:", e)finally:print("Thread exiting")_thread.start_new_thread(robust_thread, ())

线程优先级与调度

MicroPython 的线程调度通常是抢占式的,但具体行为取决于底层实现。开发者无法直接设置线程优先级,需通过延时控制来协调线程执行。

import _thread
import timedef high_freq_task(name,interval):while True:# 高频任务print(name)time.sleep(interval)def low_freq_task(name,interval):while True:print(name)time.sleep(interval)_thread.start_new_thread(high_freq_task, ("High_Freq_Thread",1))
_thread.start_new_thread(low_freq_task, ("Low_Freq_Thread",5))

运行结果:
High_Freq_Thread
High_Freq_Thread
High_Freq_Thread
High_Freq_Thread
Low_Freq_Thread
High_Freq_Thread
High_Freq_Thread
High_Freq_Thread
High_Freq_Thread
High_Freq_Thread
Low_Freq_Thread

参数说明:从上面例程及运行结果,我们很容易知道,第一个参数是线程名称,后面的参数就比较灵活,甚至可以不需要任何参数。

 实例分析

下面代码是我们真实项目中的部分代码:

import _thread as threadlock = thread.allocate_lock()def configwifi_task(name):if wlan.ssid and wlan.password:with lock:wlansts = wlan.check_wifi()if not wlansts :with lock:tft.showstring("正在连接到 " + wlan.ssid,Chat_X_Posi,Chat_Hint_Y_Posi,color(0,0xff,0))try:with lock:wlan.wlan.connect(wlan.ssid,wlan.password)max_wait = 10while max_wait > 0:with lock:wlansts = wlan.check_wifi()if wlansts:breakmax_wait -= 1text = "等待连接……" + "{:02d}".format(max_wait)tft.showstring(text,Chat_X_Posi,Chat_Hint_Y_Posi + 20,color(0,0xff,0))
#                    print(text)time.sleep(1)with lock:wlansts = wlan.check_wifi()tft.fill(color(0,0,0))tft.battery_status(H_Pixel - 20,0,20,12,percent)tft.show()if not wlansts:tft.showstring("连接失败",Chat_X_Posi,Chat_Hint_Y_Posi,color(0,0xff,0))except Exception as e:
#                print(e)tft.showstring("连接失败",Chat_X_Posi,Chat_Hint_Y_Posi,color(0,0xff,0))thread.start_new_thread(configwifi_task,("wificonnect",))   

 先简单说明一下,启动这个线程的原因。我们的项目需要用到WIFI,开始的时候,我们程序启动后直接连接WIFI,但很快发现,WIFI连接有时需要较长时间,甚至有时会接连失败,这就导致我们需要等待较长时间,才能进行后续的操作,所以我们建立了一个专门用于连接WIFI的线程。

之所以把这个线程拿出来作实例讲解,是因为我们刚开始的时候犯了个大错,我们没有添加线程锁机制,导致程序崩溃,启动直接崩溃,最要命的是,我们做这个之前没有备份,差不多3天修改添加的代码全在板上,电脑上最新的代码是3天前的。所以特意拿这部分代码出来做实例,提醒大家线程锁机制的重要性。

启用线程时,多个线程中都有访问的硬件资源一定要添加锁机制。

该线程本身的功能非常简单,就是连接WIFI,并等待10秒,连接成功则立即结束线程,否则提示连接失败结束线程。

相关文章:

MicroPython 开发ESP32应用教程 之 线程介绍及实例分析

MicroPython ESP32 线程(Thread)基础 MicroPython 在 ESP32 上支持线程(Thread)功能,通过 _thread 模块实现。线程允许程序并发执行多个任务,适合处理需要同时运行的场景,例如传感器数据采集和…...

鸿蒙5开发宝藏案例分享---一多断点开发实践

🌟【鸿蒙开发实战进阶】六大核心案例深度拆解,带你玩转多端适配! 📐 案例4:动态网格布局(电商商品列表) 应用场景:手机/平板商品展示差异 痛点分析:手机单列→平板多列&…...

嵌入式学习之系统编程(六)线程

目录 一、线程 (一)线程概念 (二)特征 (三)优缺点 二、线程与进程的区别(面问) 三、多线程程序设计步骤 四、线程的创建(相关函数) 1、pthread_create…...

分布式常见概念

分布式常见概念 反向代理正向代理 vs 反向代理(对比理解名称)正向代理示意(“我去帮你拿数据”)反向代理示意(“你找我,我替你联系内部服务器”)为什么叫“反向”? API网关一、为什么…...

数据库的事务(Transaction)

在数据库中,事务(Transaction) 是保证数据操作一致性和完整性的核心机制。它通过一组原子性的操作单元,确保所有操作要么全部成功(提交),要么全部失败(回滚)。以下是数据…...

大语言模型 提示词的少样本案例的 演示选择与排序新突破

提示词中 演示示例的选择与排序 这篇论文《Rapid Selection and Ordering of In-Context Demonstrations via Prompt Embedding Clustering》聚焦于提升大语言模型(LLMs)在自适应上下文学习(ICL)场景中演示示例的选择与排序效率 一、论文要解决的问题 在上下文学习(ICL)…...

【算法篇】二分查找算法:基础篇

题目链接: 34.在排序数组中查找元素的第一个和最后一个位置 题目描述: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返…...

Qtc++开发遇到的问题-按钮点击不管用?

我在设计自己的控件的时候,遇到了按钮点击不管用的问题,而且是有的自定义控件不管用,有的管用,有的一开始管用,多点几次就不管用了, 它是这样的,一个lineEdit和位于两侧的按钮,分别…...

重磅发布 | 复旦533页《大规模语言模型:从理论到实践(第2版)》(免费下载)

在人工智能浪潮席卷全球的今天,大语言模型正以前所未有的速度推动着科技进步和产业变革。从 ChatGPT 到各类行业应用,LLM 不仅重塑了人机交互的方式,更成为推动学术研究与产业创新的关键技术。 面对这一飞速演进的技术体系,如何系…...

智能体赋能效率,企业知识库沉淀价值:UMI企业智脑的双轮驱动!

智能体企业知识库:UMI企业智脑的核心功能与价值 在人工智能技术飞速发展的今天,企业智能化转型已经成为不可逆转的趋势。作为企业级AI智能体开发平台的佼佼者,优秘智能推出的UMI企业智脑,以其强大的智能体开发能力和全面的企业知…...

STM32CubeMX,arm-none-eabi-gcc简单试用

在windows下,为stm32系列单片机编程,keil有了免费的试用版,有很多开发板示例,给学习单片机编程带来很大的方便。 STM32CubeMX提供了stm32单片机的功能设置,在输出方式上给出了几种方式,有mdk(k…...

Spring AI(一)

Spring AI 官网 Spring AI 是一个用于 AI 工程的应用程序框架。其目标是将 Spring 生态系统设计原则(如可移植性和模块化设计)应用于 AI 领域,并将使用 POJO 作为应用程序的构建块推广到 AI 领域。 Spring AI 的核心是解决了 AI 集成的根本挑战:将您的企业数据和 API 与 A…...

Nacos适配GaussDB超详细部署流程

1部署openGauss 官方文档下载 https://support.huaweicloud.com/download_gaussdb/index.html 社区地址 安装包下载 本文主要是以部署轻量级为主要教程 1.1系统环境准备 操作系统选择 系统AARCH64X86-64openEuler√√CentOS7√Docker√√1.2软硬件安装环境 版本轻量版(单…...

vue-pure-admin动态路由无Layout实现解决方案

背景: 最近在使用vue-pure-admin开发后台项目的时候发现作者并没有动态路由的全屏无Layout实现方案。查询作者路由发现,作者只做了静态路由的无Layout方案,其它动态路由,作者在做整合的时候,都放进了 \ 下面的子路由&…...

vue项目 build时@vue-office/docx报错

我在打包vue项目时, 开始用的npm run build和cnpm run build,总是提示 vue-office/docx 错误,尝试过用cnpm重新安装node_modules几次都没用。类似下面的提示一直有。 Error: [commonjs--resolver] Failed to resolve entry for package "…...

卓力达蚀刻工艺:精密制造的跨行业赋能者

引言 蚀刻技术作为现代精密制造的核心工艺之一,通过化学或物理方法对金属材料进行选择性去除,实现微米级复杂结构的加工。南通卓力达凭借20余年技术积淀与全产业链布局,成为全球高端制造领域的重要支撑力量。本文将从蚀刻技术的多领域应用与…...

【大模型面试每日一题】Day 30:解释一下 FlashAttention 技术,并对比其与传统注意力在显存效率和计算性能上的差异。

【大模型面试每日一题】Day 30:解释一下 FlashAttention 技术,并对比其与传统注意力在显存效率和计算性能上的差异。 📌 题目重现 🌟🌟 面试官:解释一下 FlashAttention 技术,并对比其与传统注…...

#RabbitMQ# 消息队列入门

目录 一 MQ技术选型 1 运行rabbitmq 2 基本介绍 3 快速入门 1 交换机负责路由消息给队列 2 数据隔离 二 Java客户端 1 快速入门 2 WorkQueue 3 FanOut交换机 4 Direct交换机 5 Topic交换机 *6 声明队列交换机 1 在配置类当中声明 2 使用注解的方式指定 7 消息转…...

在promise中,多个then如何传值

在 JavaScript 中,Promise 的多个 .then() 是链式调用的,值可以通过返回值的方式,在多个 .then() 之间传递。这是 Promise 链式调用的核心机制。 基本原理:每个 then 接收上一个 then 的返回值 new Promise((resolve, reject) &g…...

TCP 三次握手过程详解

TCP 三次握手过程详解 一、TCP握手基础概念 1.1 什么是TCP握手 TCP三次握手是传输控制协议(Transmission Control Protocol)在建立连接时的标准过程,目的是确保通信双方具备可靠的双向通信能力。 关键结论:三次握手的本质是通过序列号同步和能力协商建立可靠的逻辑连接。 …...

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题

EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题 一、核心原理:分解提示与多空间投影 1. 提示分解:用低秩矩阵压缩长提示 传统问题: 长提示(如100个token)精度高但训练慢,短提示(如20个token)速度快但…...

云原生安全核心:云安全责任共担模型(Shared Responsibility Model)详解

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 1. 基础概念 什么是云安全责任共担模型? 云安全责任共担模型(Shared Responsibility Model, SRM)是云服务提供商&…...

go并发与锁之sync.Mutex入门

sync.Mutex 原理:一个共享的变量,哪个线程握到了,哪个线程可以执行代码 功能:一个性能不错的悲观锁,使用方式和Java的ReentrantLock很像,就是手动Lock,手动UnLock。 使用例子: v…...

[Java恶补day8] 3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “…...

LabVIEW教学用开发平台

一、培训目标 基础编程:掌握 LabVIEW 数据类型、程序结构、子 VI 设计与调试技巧。 硬件通信:精通 RS-232/485、TCP/IP、Modbus、PLC 等工业通信协议及实现。 高级设计模式:熟练运用状态机、生产者 - 消费者模式构建复杂测控系统。 项目实…...

Package Size Comparison – 6 Leads

Package Size Comparison 6 LeadsTSOP SOT SM SMT SOT23 SC-74 SC-59 SC-88 SOT363 US6 UMT6 SC-70 SOT563 ES EMT SC-75-6...

python打卡day38

Dataset和DataLoader 知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 作业:了解下cifar数据集,尝试获取其中一张图片 在遇到大规模数据集时&#xff0c…...

vLLM 核心技术 PagedAttention 原理详解

本文是 vLLM 系列文章的第二篇,介绍 vLLM 核心技术 PagedAttention 的设计理念与实现机制。 vLLM PagedAttention 论文精读视频可以在这里观看:https://www.bilibili.com/video/BV1GWjjzfE1b 往期文章: vLLM 快速部署指南 1 引言&#xf…...

rpm安装jenkins-2.452

rpm安装jenkins-2.452 一、下载和安装 1、Jenkins下载 版本2.452可用windows下载: https://mirrors.jenkins-ci.org/redhat-stable/jenkins-2.452.4-1.1.noarch.rpm 其他版本 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.440.3-1.1.noarch.rpm 2、jenkins安装 $r…...

《软件工程》第 2 章 -UML 与 RUP 统一过程

在软件工程领域,UML(统一建模语言)与 RUP(统一过程)是进行面向对象软件开发的重要工具和方法。接下来,我们将深入探讨第 2 章的内容,通过案例和代码,帮助大家理解和掌握相关知识。 …...