《python》—— threading库(线程和多线程)

news2025/3/13 8:11:31

文章目录

    • threading简介
    • threading基本概念
    • 常用类和方法
    • 线程同步
    • 线程池
    • 实例

threading简介

threading 是 Python 标准库中用于实现多线程编程的模块。多线程编程允许程序同时执行多个任务,提高程序的并发性能,尤其适用于 I/O 密集型任务,例如网络请求、文件读写等。、

threading基本概念

  • 线程(Thread):是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
  • 多线程(Multithreading):指的是在一个程序中同时运行多个线程,每个线程可以独立执行不同的任务。

常用类和方法

  • Thread 类
    • Thread 类是 threading 模块中最核心的类,用于创建和管理线程。
      • 创建线程的方式:
        • 方式一:直接实例化 Thread 类

          import threading
          
          # 定义一个函数作为线程要执行的任务
          def print_numbers():
              for i in range(5):
                  print(f"Number: {i}")
          
          # 创建线程对象
          thread = threading.Thread(target=print_numbers)
          
          # 启动线程
          thread.start()
          
          # 等待线程执行完毕
          thread.join()
          
          print("Main thread finished.")
          
        • 结果:
          在这里插入图片描述

        • 方式二:继承 Thread 类

          import threading
          
          # 自定义线程类,继承自 threading.Thread
          class MyThread(threading.Thread):
              def run(self):
                  for i in range(5):
                      print(f"Number: {i}")
          
          # 创建线程对象
          thread = MyThread()
          
          # 启动线程
          thread.start()
          
          # 等待线程执行完毕
          thread.join()
          
          print("Main thread finished.")
          
        • 结果:
          在这里插入图片描述

      • 其他常用方法和属性
        • getName() 和 setName():用于获取和设置线程的名称。

          import threading
          
          def print_hello():
              print(f"Hello from {threading.current_thread().getName()}")
          
          thread = threading.Thread(target=print_hello)
          thread.setName("MyThread")
          thread.start()
          thread.join()
          
        • is_alive():用于判断线程是否还在运行。

          import threading
          import time
          
          def long_task():
              time.sleep(2)
          
          thread = threading.Thread(target=long_task)
          thread.start()
          print(f"Thread is alive: {thread.is_alive()}")
          thread.join()
          print(f"Thread is alive: {thread.is_alive()}")
          

          在这里插入图片描述

线程同步

在多线程编程中,多个线程可能会同时访问和修改共享资源,这可能会导致数据不一致的问题。为了解决这个问题,threading 模块提供了一些同步机制。

  • Lock 类
    • Lock 是一种最基本的同步原语,用于确保同一时间只有一个线程可以访问共享资源。

      import threading
      
      # 创建一个锁对象
      lock = threading.Lock()
      shared_variable = 0
      
      def increment():
          global shared_variable
          for _ in range(100000):
              # 获取锁
              lock.acquire()
              try:
                  shared_variable += 1
              finally:
                  # 释放锁
                  lock.release()
      
      threads = []
      for _ in range(2):
          thread = threading.Thread(target=increment)
          threads.append(thread)
          thread.start()
      
      for thread in threads:
          thread.join()
      
      print(f"Shared variable: {shared_variable}")
      

      在这里插入图片描述

  • RLock 类
    • RLock 是可重入锁,允许同一个线程多次获取锁而不会导致死锁。
      import threading
      
      # 创建一个可重入锁对象
      rlock = threading.RLock()
      
      def recursive_function():
          rlock.acquire()
          try:
              print("Lock acquired")
              recursive_function()
          finally:
              rlock.release()
      
      thread = threading.Thread(target=recursive_function)
      thread.start()
      thread.join()
      

线程池

虽然 threading 模块本身没有直接提供线程池的功能,但可以使用 concurrent.futures 模块中的 ThreadPoolExecutor 来实现线程池。

import concurrent.futures

def square(x):
    return x * x

with concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:
    results = executor.map(square, [1, 2, 3, 4, 5])

for result in results:
    print(result)

在这里插入图片描述
在上述代码中,ThreadPoolExecutor 用于创建一个线程池,max_workers 参数指定了线程池中的最大线程数。executor.map() 方法用于并行执行任务

实例

实例代码展示了 Python 中 threading 模块的基本使用,包括创建线程、启动线程以及向线程函数传递参数等操作。

import threading


def worker():
    print('线程开始执行')
    for i in range(5):
        print(f'线程正在工作:{i}')
    print('线程执行完毕')
thread = threading.Thread(target=worker)
thread.start()
print('***主线程继续执行***')


'''传递参数'''
def worker(name):
    print(f'{name}线程开始执行')
    for i in range(5):
        print(f'{name}正在工作:{i}')
    print(f'{name}线程执行完毕')

thread = threading.Thread(target=worker,args=('线程1',))
thread.start()
print('***主线程继续执行***')

import threading
import time

def run(n):
    print('task', n)
    time.sleep(1)
    print('2s')
    time.sleep(1)
    print('1s')
    time.sleep(1)

def run2(t):
    time.sleep(t)
    print(f'我等了{t}秒')

if __name__ == '__main__':
    t1 = threading.Thread(target=run, args=('t1',))
    t2 = threading.Thread(target=run, args=('t2',))
    # 启动 t1 和 t2 线程
    t1.start()
    t2.start()

    # 修正参数,传递整数秒数
    t3 = threading.Thread(target=run2, args=(5,))
    t4 = threading.Thread(target=run2, args=(8,))
    # 启动 t3 线程
    t3.start()
    # 启动 t4 线程
    t4.start()

    # 主线程等待 10 秒
    time.sleep(10)
    print('开始倒计时')

结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据分享】2000-2024年全国逐年归一化植被指数(NDVI)栅格数据(年最大值)

NDVI,全名为Normalized Difference Vegetation Index,中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力,我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 之前我们给大家分享了来源于MOD13A3数…

混沌理论与混沌映射——算法改进初始化创新点之一

混沌理论与混沌映射 混沌理论研究混沌系统的动力学,其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的,混沌系统可以在不依赖随机性的情况下表现出不规则的行为,因为确…

19874并查集

19874并查集 ⭐️难度:中等 🌟考点:并查集、数据结构 📖 📚 import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…

Jmeter下载安装配置及使用

1、下载 官网地址:Apache JMeter - Download Apache JMeter 2、配置环境变量 ①找到环境变量,两种方法 法一:我的电脑→右键菜单→属性→高级系统设置→环境变量 法二:直接搜索环境变量 ②新建两个系统变量 1.变量名&#x…

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…

【算法day8】 Z 字形变换 -O(n)算法思路整理

Z 字形变换,算法思路整理 https://leetcode.cn/problems/zigzag-conversion/description/ 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下…

L3-1 夺宝大赛

输入样例 1: 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1: 7 6样例 1 说明: 七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6&#xff0c…

Matlab:矩阵运算篇——矩阵

目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…

泛微ecode的页面开发发送请求参数携带集合

1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况,那么这里就有一些如下的注意事项,如以下代码: // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

Javaweb后端全局异常处理器

类名随便定义 这是异常处理的方法exceptionhandler responsebody作用,方法的响应值返回给前端,如果返回的是集合对象,会把集合对象转为json,再给前端响应返回

SpringBoot缓存抽象:@Cacheable与缓存管理器配置

文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…

江科大51单片机笔记【11】AT24C02(I2C总线)

一、存储器 1.介绍 RAM的特点是存储速度特别快,但是掉电会丢失;ROM的特点是存储速度特别慢,但是掉电不会丢失 SRAM是所有存储器最快的,一般用于电脑的CPU高速缓存,容量相对较少,成本较高;DRAM…

外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试

思路&#xff1a;外层旋转后坐标&#xff0c;元素旋转后坐标&#xff0c;计算偏移坐标 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…

Docker容器安装软件(完整版)

文章目录 一、安装Docker1.1 docker 相关的命令1.2 配置镜像加速 二. 安装es2.1 创建网络2.2 拉取镜像2.3 创建挂载点目录2.4 部署单点es&#xff0c;创建es容器2.5 编写elasticsearch.yml2.6 重启es容器2.7 测试Elasticsearch是否安装成功 三. 基于Docker安装Kibana3.1 拉取镜…

「 机器人 」扑翼飞行器通过总气动力控制四自由度运动方法

一、前言 在扑翼飞行中,总气动力(Total Aerodynamic Force)是指扑翼在运动过程中受到的所有空气动力作用的合力。它是由以下两种主要力的合成结果: 1. 升力(Lift, ):垂直于空气流方向的力,用于支持飞行器(或生物)的重量。 2. 阻力(Drag, ):平行于空气流方向的力,…

Axios简单说明,快速上手

Ajax&#xff1a;异步的JavaScript和XML 作用&#xff1a; 数据交换异步交互 Axios&#xff1a;就是对原生Ajax进行封装&#xff0c;简化书写&#xff0c;快速开发 使用逻辑&#xff1a; 首先要安装Axios&#xff0c;可以通过npm在项目中安装&#xff1a; 打开命令行工具…

云服务器安装宝塔面板部署

单机部署(前端vue项目) 服务器安装宝塔面板 连接到服务器 使用 SSH 连接到你的服务器&#xff1a; ssh rootip安装宝塔面板 运行以下命令来安装宝塔面板&#xff1a; yum install -y wget wget -O install.sh http://download.bt.cn/install/install_6.0.sh sh install.sh安…

通义万相 2.1:AIGC 领域的 “王炸” 组合如何颠覆创作生态?

引言 在数字化和人工智能的飞速发展中&#xff0c;AIGC&#xff08;AI生成内容&#xff09;技术已经成为推动创作、设计和内容生成领域创新的核心力量。而当通义万相2.1与蓝耘智算平台强强联手&#xff0c;这一“王炸”组合不仅提升了AIGC的效率&#xff0c;还为创作生态带来了…

elementPlus之日历扩展功能

在这里做个记录&#xff0c;感觉用得还挺多的 功能有如下&#xff1a; 切换月份按钮对应日历视图和中间日期都要变选择日期日历视图要变点击日历视图中的不属于当前选中月份的日期即可触发日历视图变化以及中间日期也要变 代码如下&#xff1a; <template><div clas…

C# NX二次开发:获取模型中所有表达式并且更新某个表达式的值

大家好&#xff0c;今天要讲的是关于NX中表达式的相关UFUN函数。 UF_MODL_ask_exps_of_part (view source) tag_tpart_tagInputTag of the part to be queriedint *number_of_expsOutputNumber of expressions returnedtag_t * *expsOutput to UF_*free*All the expressions i…