Python线程使用详解:从基础到高级实战

Python 线程池详解:从基础使用到高级实践 本文详细介绍了Python线程池的使用方法和优化技巧。线程池通过复用线程减少创建销毁开销,特别适合IO密集型任务。文章讲解了ThreadPoolExecutor模块的基本操作(创建、提交任务、关闭)、高级功能(结果处理、并发控制)以及max_workers参数设置指南,并提供了网页爬取的实战案例。同时指出了GIL限制、线程安全等常见问题及解决方案。最后对比了线程池与其他并发方案的优缺点,帮助开发者根据任务类型选择合适方案,提升程序性能。 阅读详情
AI摘要

本文详细介绍Python线程使用,涵盖线程基础概念、基本使用、同步与通信、线程池使用等内容。阐述了GIL对线程性能的影响,给出线程最佳实践和常见问题解决方案。指出在I/O密集型任务中合理使用线程可提升程序性能。

包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】

1. 线程基础概念
1.1 什么是线程?
线程(Thread)是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,这些线程共享进程的内存空间。

1.2 Python中的线程实现
Python通过threading模块提供线程支持。需要注意的是,由于GIL(全局解释器锁)的存在,Python的多线程在CPU密集型任务上性能提升有限,但在I/O密集型任务中仍能显著提高程序效率。

2. 线程的基本使用
2.1 创建线程
Python中创建线程有两种主要方式:

方法一:使用Thread类直接创建

import threading

def worker():
    print("线程执行中...")
    print(f"当前线程: {threading.current_thread().name}")

# 创建线程
t = threading.Thread(target=worker, name="工作线程")
t.start()
t.join()  # 等待线程结束
print("主线程结束")

方法二:继承Thread类

class MyThread(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name
        
    def run(self):
        print(f"{self.name}线程执行中...")
        print(f"当前线程ID: {threading.get_ident()}")

t = MyThread("自定义")
t.start()
t.join()

2.2 线程常用方法
在这里插入图片描述
3. 线程同步与通信
3.1 锁(Lock)

import threading

counter = 0
lock = threading.Lock()

def increment():
    global counter
    for _ in range(100000):
        with lock:  # 自动获取和释放锁
            counter += 1

threads = []
for i in range(5):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(f"最终计数器值: {counter}")  # 正确输出500000

3.2 条件变量(Condition)

import threading
import time

condition = threading.Condition()
items = []

def consumer():
    with condition:
        while not items:
            condition.wait()  # 等待通知
        print(f"消费: {items.pop(0)}")

def producer():
    with condition:
        items.append(1)
        condition.notify()  # 通知等待的线程

t1 = threading.Thread(target=consumer)
t2 = threading.Thread(target=producer)
t1.start()
time.sleep(1)  # 确保consumer先执行
t2.start()
t1.join()
t2.join()

3.3 信号量(Semaphore)

import threading
import time

semaphore = threading.Semaphore(3)  # 最多允许3个线程同时访问

def access_resource(thread_id):
    with semaphore:
        print(f"线程{thread_id}正在访问资源")
        time.sleep(2)
        print(f"线程{thread_id}释放资源")

threads = []
for i in range(10):
    t = threading.Thread(target=access_resource, args=(i,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

4. 线程池的使用
Python 3.2+引入了concurrent.futures模块,提供了更高级的线程池接口:

from concurrent.futures import ThreadPoolExecutor
import time

def task(n):
    print(f"处理任务{n}")
    time.sleep(2)
    return n * n

with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交任务
    futures = [executor.submit(task, i) for i in range(10)]
    
    # 获取结果
    for future in futures:
        print(f"结果: {future.result()}")

5. 线程高级话题
5.1 GIL(全局解释器锁)的影响
GIL确保同一时间只有一个线程执行Python字节码

对I/O密集型任务影响较小

对CPU密集型任务考虑使用多进程(multiprocessing模块)

5.2 线程局部数据

import threading

local_data = threading.local()

def show_data():
    print(f"{threading.current_thread().name}: {getattr(local_data, 'value', None)}")

def worker(value):
    local_data.value = value
    show_data()

t1 = threading.Thread(target=worker, args=("线程1的数据",), name="Thread-1")
t2 = threading.Thread(target=worker, args=("线程2的数据",), name="Thread-2")
t1.start()
t2.start()
t1.join()
t2.join()

5.3 定时器线程

from threading import Timer

def hello():
    print("Hello, 定时器!")

t = Timer(5.0, hello)  # 5秒后执行
t.start()

6. 线程最佳实践
避免过度使用线程:线程不是越多越好,要考虑上下文切换开销

优先使用线程池:避免频繁创建销毁线程

合理使用锁:锁粒度要适中,避免死锁

注意线程安全:特别是对共享资源的访问

考虑替代方案:对于CPU密集型任务,考虑多进程或异步IO

加粗样式7. 常见问题与解决方案
7.1 如何停止线程?
Python没有直接停止线程的方法,推荐使用标志位:

import threading
import time

class StoppableThread(threading.Thread):
    def __init__(self):
        super().__init__()
        self._stop_event = threading.Event()
    
    def stop(self):
        self._stop_event.set()
    
    def stopped(self):
        return self._stop_event.is_set()
    
    def run(self):
        while not self.stopped():
            print("线程运行中...")
            time.sleep(1)
        print("线程已停止")

t = StoppableThread()
t.start()
time.sleep(3)
t.stop()
t.join()

7.2 如何处理线程异常?

import threading
import sys

def worker():
    try:
        raise ValueError("线程内部错误")
    except Exception as e:
        print(f"捕获线程异常: {e}")
        # 可以在这里记录日志或通知主线程

def excepthook(args):
    print(f"线程异常: {args.exc_value}")

# 设置线程异常钩子
threading.excepthook = excepthook

t = threading.Thread(target=worker)
t.start()
t.join()

8. 性能对比示例
I/O密集型任务中线程的优势:

import threading
import time
import requests

def download(url):
    response = requests.get(url)
    print(f"{url} 下载完成,长度: {len(response.content)}")

# 顺序执行
start = time.time()
download("https://www.python.org")
download("https://www.baidu.com")
download("https://www.qq.com")
print(f"顺序执行耗时: {time.time() - start:.2f}秒")

# 多线程执行
start = time.time()
threads = []
for url in ["https://www.python.org", "https://www.baidu.com", "https://www.qq.com"]:
    t = threading.Thread(target=download, args=(url,))
    threads.append(t)
    t.start()

for t in threads:
    t.join()
print(f"多线程执行耗时: {time.time() - start:.2f}秒")

9. 总结
Python的threading模块为多线程编程提供了强大的支持。虽然受GIL限制,但在I/O密集型任务、GUI应用和网络请求等场景中,合理使用线程仍能显著提升程序性能。掌握线程同步、通信和线程池等高级特性,可以帮助开发者编写出更高效、更健壮的多线程程序。

最后:
希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利
最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。

包含编程资料、学习路线图、源代码、软件安装包等!【点击这里领取!】
① Python所有方向的学习路线图,清楚各个方向要学什么东西
② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
③ 100多个Python实战案例,学习不再是只会理论
④ 华为出品独家Python漫画教程,手机也能学习

在这里插入图片描述

python多线程:Thread类的用法 自定义一个Thread的子类,然后复写它的run()方法13.GIL全局解释器锁(global interpreter lock),每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行。Python的标准实现是CPython。CPython执行Python代码分为2个步骤:首先,将文本源码解释编译为字节码,然后再用一个解释器去 解释运行字节码。 阅读详情

相关推荐

python 创建和使用线程池

众所周知,python3多线程有threading,很好的支持了多线程,那么问题来了,为什么还需要线程池呢,其实很好回答,如果你要爬取网站有八百页,每页设置一个线程,难道能开启八百个么,光切换的时间也很高了吧。这时候就需要用到线程池,可以设置一个20的线程池,同时只有20个县城在运行,剩下的排队。直接上讲解 线程池模块 在threading中是没有线程池相关功能的,想要运行线程池需要自己重写,很明显向我这么懒不可能重写,而且自己编写线程池很难写的比较完美,还需要考虑复杂情况下的线程同步,很容易发生死锁。所以

weixin_45621200的博客 5897

Python 线程

文章目录线程介绍代码实现线程threading 模块threading.Thread1. 创建线程2. 线程实现TCP服务端的并发3. 线程 join 方法4. 线程之间共享5. 线程对象属性和方法守护线程GIL全局解释器锁 线程介绍 1. 在前面了解了进程的概念,简单来说进程就是在内存中申请了一块内存空间,其实还有一个线程的概念, 线程包含在进程之中,是代码真正的执行者。也就是说进程其实是一个资源单位,而线程是执行单位。 2. 线程是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程

XWenXiang的博客 4523

Python线程池的使用

线程池是一种并发编程的技术,它可以提供一组预先创建的线程,用于执行任务。通过使用线程池,可以避免频繁地创建和销毁线程,从而提高程序的性能和效率。在Python中,我们可以使用内置的。这样,我们就完成了线程池的使用。通过使用线程池,我们可以方便地管理并发任务,并通过多线程的执行提高程序的性能。接下来,我们可以定义一个函数,代表我们要在线程池中执行的任务。下面是一个详细的示例,展示了如何在Python中使用线程池。类创建一个线程池,并指定线程池的大小(即最大并发线程数)。最后,我们可以打印出所有任务的结果。

BUG?不存在的! 400

Python中的线程

Python中的线程 1.线程创建及参数传参 2.多线程的操作 3.互斥锁和死锁 多任务场景介绍 生活中的多任务场景介绍 1. 提问 利用现学知识能够让两个函数或者方法同时执行吗? 不能,因为之前所写的程序都是单任务的,也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行,要想实现这种操作就需要使用多任务。 多任务的最大好处是充分利用CPU资源,提高程序的执行效率。 2. 多任务的概念 多任务是指在同一时间内执行多个任务,例如: 现在电脑安装的操作系统都是多任务操作系统,可以同时运行着多个软件。

LAM1006_csdn的博客 1万+

【Verilog】valid-ready双向握手机制 ——很绕但是很有意思

valid-ready双向握手机制。

GalaxyerKw的博客 1万+

量子密钥分发(QKD)原理、工程实现与实战部署全解析

密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码

weixin_29324401的博客 346

python多线程详解(超详细)

一、多线程介绍 1、什么是线程? 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行 2、为什么要使用多线程? 线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。 因为线程的划分尺度小

耐心的小黑的博客 1万+

AGV舵轮选型实战:从核心参数到精准计算的完整指南

本文提供了一份详尽的AGV舵轮选型实战指南,强调从经验决策转向数据驱动。文章系统讲解了如何将工况需求转化为核心参数,并通过牵引力、扭矩、功率等关键计算步骤,指导工程师完成精准选型,避免因选型不当导致的运行故障与效率低下。

醉三国 495

Python多线程实战:从基础案例到高级应用场景

Python多线程编程是提升I/O密集型任务性能的有效方法。本文介绍了Python多线程的基础概念、经典案例和高级应用,包括其局限性(受GIL影响不适合CPU密集型任务)。通过示例展示了线程创建、线程池使用(ThreadPoolExecutor)、生产者-消费者模型等核心用法,并重点讲解了线程安全(Lock、Condition)、死锁预防等同步机制。文章还提供了Web爬虫和实时数据监控系统两个高级应用场景,演示了多线程在实际项目中的优化实践。适合需要提升程序并发性能的Python开发者学习参考。

专注于与编程相关的知识内容分享 673

Python金融数据获取工具库之baostock使用详解

在金融数据分析和量化交易中,获取准确及时的市场数据是非常重要的。baostock是一个专门为中国股市数据提供支持的 Python 库,它提供了免费的股票数据接口,用户可以方便地获取股票、指数、基金等各种金融数据。本文将详细介绍baostock库,包括其安装方法、主要特性、基本和高级功能,以及实际应用场景,帮助全面了解并掌握该库的使用。

Rocky006的博客 5345

PIN限幅二极管在接收机中的应用

本文介绍了接收机保护限幅器的工作原理及应用,重点阐述了PIN二极管在雷达收发机中的关键作用。文章指出,限幅器能有效保护接收机灵敏元件免受大功率信号损害,主要通过反射而非耗散功率来实现保护功能。文章详细分析了PIN二极管的层结构特性及其阻抗变化机制,解释了多级限幅器的设计原理(包括清理级和粗限幅器的配合使用),并介绍了通过添加检波二极管降低阈值水平的方法。最后指出,实际应用中限幅器通常采用3级或更少的设计。

weixin_49761275的博客 2374

Python多线程编程实战:从基础到高级应用与性能优化

并发编程是现代软件开发的核心概念,旨在通过同时执行多个任务来提升程序效率。其基本原理在于利用CPU等待I/O操作(如网络请求、文件读写)的时间,切换到其他就绪任务执行,从而最大化资源利用率。这一技术对于构建高响应、高吞吐的应用程序具有重要价值,尤其在Web服务器、数据爬虫、实时监控等I/O密集型场景中效果显著。Python通过标准库的`threading`模块提供了直观的多线程实现,允许创建多个共享内存的执行流。尽管存在全局解释器锁(GIL)对纯CPU密集型任务的并行限制,但通过合理运用线程同步机制(如互斥

weixin_33724570的博客 402

【低照度图像增强系列】使用MSRCR(Multi-Scale Retinex with Color Restoration)算法对低照度图像进行增强处理

【低照度图像增强系列】使用MSRCR(Multi-Scale Retinex with Color Restoration)算法对低照度图像进行增强处理

静谧、淡雅 649

Java开发实战技巧分享:从基础到高级的全面指南

在当今的软件开发领域,Java 以其卓越的稳定性、跨平台能力和庞大的生态系统,持续占据着重要地位。掌握这些实战技巧,不仅能提升你的开发效率,还能让你的 Java 代码更加健壮、高效和易于维护。记住,编程是一门实践的艺术,只有不断练习和总结,才能真正成为优秀的 Java 开发者。避免捕获过于宽泛的异常类型(如 `Exception`),而应捕获具体的异常类型。注解是 Java 5 引入的重要特性,可以为代码添加元数据。泛型可以避免运行时的 `ClassCastException`,提升代码的类型安全性。

searchboy2025的博客 24

【MATLAB-app】csdn上第一套关于matlab appdesigner界面设计 系列“视频课”来啦~~

写作时间: 2020-12-10 标题: 01_为什么推荐你学习appdesigner? 目录: 1.什么是appdesigner? 2.appdesigner能干什么,有什么好处? 3.怎么学习?保证你一周内能够学会! 4.我的课程总目录 5.重磅来袭(如何获取学习资料代码+文档+视频) 正文: 1.什么是appdesigner? 2.appdesigner能干什么,有什么好处? 3.怎么学习?保证你一周内能够学会! 4.我的课程总目录 5.重磅来袭(如何获取学习资料代码+文档+视频) THE END

wind 2万+

使用SIMD思想进行memcpy的优化

arm64平台的memcpy的性能优化,相比C库提升30~40%,SIMD优化思路

zhaoxin1989的博客 1万+

提高性能的艺术:Python中的高级多线程应用

通过本文,我们不仅学习了Python中多线程的基础知识、同步机制和实际应用,还简要介绍了多线程编程的最佳实践和注意事项。多线程编程是一个复杂但极富挑战性的领域,正确地使用多线程可以显著提高程序的性能和响应速度。然而,多线程编程也带来了数据安全、死锁和调试等问题。开发者需要仔细设计线程间的交互,合理地使用同步机制,以确保程序的稳定性和高效性。此外,随着技术的不断进步,新的并发编程模型和工具不断涌现,持续学习和实践是提高自身技能的关键。

walkskyer的博客 1831

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python线程全面详解:从基础概念到高级应用

A:Python中的Queue、deque(需加锁)、collections.defaultdict(需加锁)等,或使用threading.local实现线程局部存储。当我们将程序加载到内存中运行时,系统会为它分配CPU、内存、文件句柄等资源,这时就形成了一个进程。是CPU调度的基本单位,它是进程中的一个执行流。一个进程可以包含多个线程,这些线程共享进程的资源,但每个线程有自己的执行路径和栈空间。对于CPU密集型任务,由于GIL的存在,多线程可能不会提高性能,此时应考虑多进程。

q_cccc_的博客 1433

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Statistics and Machine Learning Toolbox

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

Python多线程详解

关于Python多线程的详细解读

ifhuke的博客 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python中的多线程高级使用

在Python中,多线程是一种使程序能够同时执行多个任务的技术。🚀尽管Python的全局解释器锁(GIL)限制了线程的并行执行,但多线程仍然是IO密集型任务和提升用户界面响应性的有效手段。本文将深入探讨Python中多线程的高级用法,从基本知识点到高级技巧,助力开发者充分利用多线程的强大功能。

weixin_68789096的博客 904

lesson34:深入理解Python线程:从基础到实战优化

本文深入解析Python线程编程,从基础概念到实战应用。首先对比线程与进程差异,揭示Python特有的GIL机制对CPU密集型任务的限制及I/O密集型任务的优势。通过三种线程创建方式和同步机制(锁、条件变量、信号量)的代码示例,演示如何避免竞态条件。重点剖析多线程爬虫等I/O密集型场景的优化方案,介绍线程池管理资源的最佳实践,并总结线程安全避坑指南。文章指出Python线程虽受GIL限制,但在特定场景下仍具价值,建议根据任务类型选择多线程、多进程或异步编程方案。

2402_82363599的博客 1146

PyQt5技术详解:从基础到高级应用

你可以通过继承 PyQt5 的控件类来自定义控件,还可以使用 Qt 的样式表(类似 CSS)为控件定制外观。""")

theoxiong的博客 1710

Python进阶笔记——线程、多线程的高级应用

信号量是一种计数器,用于控制对共享资源的访问。acquire()和release()。当一个线程想要访问受保护的资源时,它必须首先调用acquire()方法来获取信号量。如果当前信号量的值大于0,则该值减1,并允许线程继续执行;如果信号量的值为0,则线程会被阻塞,直到其他线程释放信号量(通过调用release()方法)。release()方法会将信号量的值加1,从而允许一个等待的线程继续执行。

qq_46332458的博客 2368

Python ThreadPoolExecutor 使用详解:线程池高效编程指南

本教程是**Python线程池编程的权威指南**,深入解析`concurrent.futures.ThreadPoolExecutor`的核心原理与高级应用。通过**7个生产级代码案例**和**5种可视化流程图**,系统讲解线程池的创建、管理、监控与优化技术。

YAnt的博客 605

Python串口通信详解:从基础到高级

在这篇文章中,全面而深入地探讨了Python中串口通信的各个方面,从基础的串口配置、读写操作,到高级的异步读写、数据解析与协议处理,再到多线程串口通信和使用队列进行线程通信,提供了丰富的示例代码,能够全面掌握这一关键技术。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。这种方式实现了线程间的安全通信。

m0_59236602的博客 7766

Python中的并发编程:多线程高级使用

通过掌握Python中多线程的高级用法,开发者可以有效地管理和同步线程,避免常见的陷阱,如死锁和竞态条件。本文介绍了从基本到高级的多线程技巧,希望能够帮助开发者充分利用Python的多线程能力,构建更加高效和稳健的应用。

GLB_0627的博客 910
上一篇: Python运算符 //、/、% 详解与区别:从入门到精通
下一篇: Python下载文件的10种方法大全:从基础到高级实战
Python_trys
博客等级 码龄2年 4369粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值