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

python线程相关讲解

python线程相关讲解

在 Python 中,线程(Thread)是实现多任务处理(多线程)的常用手段。通过线程,你可以让程序在同一时间处理多个任务,比如同时下载多个网页、同时处理用户请求等。

下面是对 Python 中线程使用的详细讲解,包括基础知识、代码示例、注意事项和常见用法。

一、线程基础

什么是线程?
线程是操作系统能够进行运算调度的最小单位,它被包含在进程中,是进程中的实际运作单位。

Python 中的线程模块
Python 提供了两种线程方式:

  • threading 模块(推荐)
  • thread 模块(已废弃,不推荐使用)

二、使用threading模块创建线程

1. 方式一:函数方式创建线程

import threading
import timedef worker():print(f"[{threading.current_thread().name}] Start")time.sleep(2)print(f"[{threading.current_thread().name}] End")# 创建线程
t1 = threading.Thread(target=worker, name="Thread-1")
t1.start()# 主线程继续执行
print("[MainThread] Continue running...")
t1.join()  # 等待子线程完成
print("[MainThread] Finished")

2. 方式二:继承Thread

class MyThread(threading.Thread):def run(self):print(f"[{self.name}] Start")time.sleep(2)print(f"[{self.name}] End")t = MyThread(name="MyThread")
t.start()
t.join()

三、常用的线程操作方法

方法名说明
start()启动线程
join()阻塞主线程,直到子线程完成
is_alive()判断线程是否还在运行
setDaemon(True)设置为守护线程(主线程结束则强制终止)

四、线程共享数据与锁(thread lock)

线程之间共享全局变量,会产生资源竞争问题,需要加锁

示例:未加锁导致的线程冲突

import threadingcount = 0def add():global countfor _ in range(1000000):count += 1t1 = threading.Thread(target=add)
t2 = threading.Thread(target=add)t1.start()
t2.start()
t1.join()
t2.join()print("最终count:", count)

运行多次后你会发现结果不一定是 2000000,因为 count += 1 不是原子操作

加锁方式

lock = threading.Lock()def safe_add():global countfor _ in range(1000000):with lock:count += 1

五、守护线程(Daemon Thread)

守护线程随主线程一起退出:

def background_task():while True:print("后台运行中...")time.sleep(1)t = threading.Thread(target=background_task)
t.setDaemon(True)  # 设置为守护线程
t.start()time.sleep(3)
print("主线程结束")

六、线程池(推荐方式,Python 3.2+)

使用 concurrent.futures.ThreadPoolExecutor 可以更方便地管理线程

from concurrent.futures import ThreadPoolExecutor
import timedef task(n):print(f"执行任务 {n}")time.sleep(2)return f"任务 {n} 完成"with ThreadPoolExecutor(max_workers=3) as executor:futures = [executor.submit(task, i) for i in range(5)]for f in futures:print(f.result())

✅ 执行逻辑分析

  • 使用线程池最大线程数 max_workers=3,表示最多并发运行 3 个线程。

  • 一共提交了 5 个任务(task(0) 到 task(4))。

  • 每个任务都执行 print(),然后 sleep(2)。

  • f.result() 是一个阻塞调用,会等待对应的任务完成。

http://www.xdnf.cn/news/497773.html

相关文章:

  • uni-app 开发HarmonyOS的鸿蒙影视项目分享:从实战案例到开源后台
  • 显卡、Cuda和pytorch兼容问题
  • Rust 数据结构:HashMap
  • PostGIS实现栅格数据入库-raster2pgsql
  • 端口443在git bash向github推送时的步骤
  • 轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal
  • 【C++ Qt】布局管理器
  • redis的pipline使用结合线程池优化实战
  • Java大师成长计划之第25天:Spring生态与微服务架构之容错与断路器模式
  • Qt 强大的窗口停靠浮动
  • Javascript:WebAPI
  • React Fiber 架构深度解析:时间切片与性能优化的核心引擎
  • ARM (Attention Refinement Module)
  • spring -MVC-02
  • DeepSeek赋能电商,智能客服机器人破解大型活动人力困境
  • 数组集合互转问题
  • Ubuntu 安装 squid
  • 服装零售逆势密码:从4月英国7%增长看季节性消费新模型
  • 中国30米年度土地覆盖数据集及其动态变化(1985-2022年)
  • 一个指令,让任意 AI 快速生成思维导图
  • Unity序列化字段、单例模式(Singleton Pattern)
  • 通俗版解释CPU、核心、进程、线程、协程的定义及关系
  • 动态规划-64.最小路径和-力扣(LetCode)
  • c#车检车构客户管理系统软件车辆年审短信提醒软件
  • 系统架构设计(九):分布式架构与微服务
  • pytorch小记(二十二):全面解读 PyTorch 的 `torch.cumprod`——累积乘积详解与实战示例
  • Java求职面试:从核心技术到大数据与AI的场景应用
  • [Android] 安卓彩蛋:Easter Eggs v3.4.0
  • 第五项修炼:打造学习型组织
  • 前端基础之CSS