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

Python多线程:超详细实例讲解线程的创建

在当今这个追求高效和速度的时代,程序的执行效率显得尤为重要。Python作为一门广泛应用的高级编程语言,为我们提供了多线程编程的能力,让程序能够同时执行多个任务,从而大大提高了执行效率。本文将深入探讨Python中线程创建的相关知识,通过详细的实例为你展示不同的线程创建方式及其应用场景。

线程的基本概念

在深入了解线程创建之前,我们需要先明确线程的基本概念。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程可以包含多个线程,每个线程独立执行特定的任务,并且共享进程的资源。与单线程相比,多线程可以实现并发执行,显著提高程序的执行效率。

为了更好地理解线程,我们可以将进程和线程进行对比,它们主要有以下区别:

  • 地址空间:线程是进程内的一个执行单元,一个进程至少有一个线程,它们共享进程的地址空间;而进程有自己独立的地址空间。
  • 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源。
  • 处理器调度:线程是处理器调度的基本单位,但进程不是。
  • 并发执行:进程和线程均可并发执行。

Python多线程

Python线程与进程的区别

这张图片展示了时间段T内串行、并行、并发的线程情况。串行时线程A、B、C依次进行;并行时线程A、B、C同时进行;并发时线程A、B、C在时间段T内交替进行。能帮助读者更好地理解线程与进程的并发执行区别。

Python中线程创建的模块选择

Python提供了几个用于多线程编程的模块,其中 _threadthreading 模块允许程序员创建和管理线程。不过,_thread 是Python 3以前版本中 thread 模块的重命名,此模块仅提供了低级别的、原始的线程支持,以及一个简单的锁,功能比较有限。而 threading 模块是Python 3之后的线程模块,提供了功能丰富的多线程支持,因此在实际开发中推荐使用 threading 模块。

线程创建的不同方式及原理

1. 使用 threading.Thread 类创建线程

这是最直接且常用的方法。你可以创建一个 threading.Thread 的实例,并将要在线程中执行的函数作为 target 参数传递给构造函数。然后,调用该实例的 start() 方法来启动线程。

原理Thread 类封装了线程的创建和管理逻辑,当调用 start() 方法时,会在新的线程中执行 target 函数。

示例代码

import threading
import timedef worker(num):print(f'Worker: {num}')time.sleep(2)  # 模拟耗时操作print(f'Worker {num} finished')# 创建线程
thread1 = threading.Thread(target=worker, args=(1,))
thread2 = threading.Thread(target=worker, args=(2,))# 启动线程
thread1.start()
thread2.start()# 等待线程完成
thread1.join()
thread2.join()

代码解释

  • 导入模块import threading 导入 threading 模块,用于多线程编程;import time 导入 time 模块,用于模拟耗时操作。
  • 定义工作函数worker 函数接受一个参数 num,打印线程开始信息,然后暂停2秒,最后打印线程结束信息。
  • 创建线程:使用 threading.Thread 类创建线程实例,target 参数指定线程要执行的函数,args 参数是一个元组,包含传递给目标函数的参数。
  • 启动线程:调用线程实例的 start() 方法启动线程。
  • 等待线程完成:调用线程实例的 join() 方法,主线程会等待该线程执行完毕后再继续执行。

运行结果:当你运行这段代码时,你会看到两个线程同时开始执行,输出类似如下信息:

Worker: 1
Worker: 2
Worker 1 finished
Worker 2 finished

特点、适用场景和优缺点

  • 特点:简单直接,适用于创建少量线程的场景。
  • 适用场景:当需要创建的线程数量较少,且逻辑相对简单时,可以使用这种方式。例如,在一个程序中需要同时执行几个独立的小任务。
  • 优点:代码简单易懂,易于实现。
  • 缺点:如果需要创建大量线程,会频繁地创建和销毁线程,导致系统开销较大。

在这里插入图片描述

此流程图展示了用户提交线程后的处理流程。从“用户提交一个线程”开始,首先判断线程是否大于核心线程数,若小于则执行线程,若大于则判断缓存队列是否已满,满了再判断是否小于最大线程数

相关文章:

  • 一个简单的系统插桩实现​
  • AI时代新词-人工智能生成内容(AIGC)
  • Python环境搭建
  • jsoup解析页面过程中保留页面中的换行符
  • new对象时,堆会发生抢占吗
  • Docker Volume(存储卷)
  • Netty学习专栏(六):深度解析Netty核心参数——从参数配置到生产级优化
  • SpringBoot3集成Oauth2.1——6数据库存储客户端信息
  • 【数字图像处理】_笔记
  • OpenGAN:基于开放数据生成的开放集识别
  • OceanBase数据库全面解析(高级特性篇)
  • 每日Prompt:黄沙大圣
  • 爱芯元智芯片推理cn-clip
  • 用llama3微调了一个WiFiGPT 用于室内定位
  • 网页模板素材网站 web前端网页制作模板
  • 视频画质等级
  • Spring 核心配置文件(spring.xml)构建指南
  • 蓝桥杯b组c++赛道---数位dp
  • 互联网大厂Java求职面试:AI大模型与云原生架构融合中的挑战
  • Jenkins部署
  • 卖产品的网站怎么做/网站seo批量查询工具
  • 佛山免费建站平台/软文的概念是什么
  • 4线城市搞网站开发/免费个人网站注册
  • 一区适合晚上一个人看b站/含有友情链接的网页
  • godaddy做网站/西安百度搜索排名
  • 搭建网站商城/专业网页设计和网站制作公司