【Python多线程】的进阶讲解

Python多线程

  • 1. 前言
  • 2. threading 模块的基本用法
  • 3. Thread类
  • 4. 锁(Locks)
  • 5. 守护线程(Daemon Threads)
  • 6. 运用场景
  • 7. 弊端

1. 前言

Python中的多线程通过threading模块来实现,它允许你并发执行多个线程,线程是操作系统能够独立调度的最小单位,它通常被用来执行并行任务。

在解释Python的多线程之前,需要注意的是,由于全局解释器锁(Global Interpreter Lock,GIL)的存在,CPython(Python的主要实现版本)中的多线程通常不能在多个CPU核心中并行执行,GIL确保一次只有一个线程在Python对象上执行操作,防止并发访问导致的状态不一致。因此,Python的多线程更适用于I/O密集型任务而非CPU密集型任务。

2. threading 模块的基本用法

以下是使用threading模块创建和启动一个线程的基本例子:

import threading
import time# 定义一个函数用于线程执行
def my_function(arg1, arg2):for i in range(arg1, arg2):print(f"Thread running: {i}")time.sleep(1) # 模拟耗时操作# 创建线程
thread = threading.Thread(target=my_function, args=(1, 10))# 启动线程
thread.start()# 在主线程中继续执行其他操作
for i in range(20, 25):print(f"Main thread running: {i}")time.sleep(1)# 等待直到线程完成
thread.join()

3. Thread类

threading模块里,Thread是一个代表线程的类,你可以创建一个Thread类的实例并调用它的start()方法来运行新线程。每个Thread可以运行一个函数或方法。

除了直接使用threading.Thread,你也可以通过继承Thread类来定义新的线程子类,重写其中的run()方法:

class MyThread(threading.Thread):def __init__(self, arg1, arg2):super().__init__()self.arg1 = arg1self.arg2 = arg2def run(self):for i in range(self.arg1, self.arg2):print(f"Running from the extended thread class: {i}")time.sleep(1)# 使用自定义线程类
thread = MyThread(1, 5)
thread.start()
thread.join()

4. 锁(Locks)

锁是一个同步原语,用于防止多个线程同时访问共享资源,在Python中,你可以使用threading.Lock()来创建一个锁。锁有两个基本方法,acquire()release()。当一个线程通过调用acquire()获得了锁,它会阻止其他线程获取直到它调用release()释放锁。

# 创建一个锁
lock = threading.Lock()# 在需要访问共享资源前获取锁
lock.acquire()# 访问共享资源
# ...# 完成共享资源的访问后释放锁
lock.release()

可以使用 with 语句简化以上模式,这样可以保证锁被正确释放:

with lock:# 访问共享资源# ...

5. 守护线程(Daemon Threads)

守护线程是一种特殊的线程,它在主线程退出时也会随之退出,与常规线程相比,守护线程不用等待它完成才能退出程序。通过设置线程的daemon属性为True,可以将线程声明为守护线程:

thread = threading.Thread(target=my_function, args=(1, 10))
thread.daemon = True
thread.start()

6. 运用场景

在Python中,多线程经常被用于处理I/O密集型任务,例如文件读写、网络通讯等等。对于CPU密集型任务,多进程通常是更好的选择。

7. 弊端

由于GIL的存在,在CPython的多线程程序不会真正地并行执行多线程,即使在多核CPU上。为了克服这个限制,可以考虑使用multiprocessing模块,这个模块通过创建多个进程来实现真正的并行计算(每个进程有自己的GIL)。当然,每个场景下都需要仔细考虑是否适合多线程、多进程或者其他解决方案,比如异步编程(asyncio)或者其他并发框架(如concurrent.futures)。

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

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

相关文章

深入浅出前端本地储存(1)

引言 2021 年,如果你的前端应用,需要在浏览器上保存数据,有三个主流方案: CookieWeb Storage (LocalStorage)IndexedDB 这些方案就是如今应用最广、浏览器兼容性最高的三种前端储存方案 今天这篇文章就聊一聊这三种方案的历史…

基于python的4s店客户管理系统

技术:pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展,并和生活进行了紧密的结合。目前,网络的运行速度以达到了千兆,覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

pyvista可视化代码优化

同时显示多组点云 import os import glob import randomimport pyvista as pvdef display_multi_mesh(meshes: list, titlesNone, point_size3, opacity0.9):num len(meshes)pl pv.Plotter(shape(1, num))pl.set_background([0.9, 0.9, 0.9])for i in range(num):pl.subplo…

jmeter打开文件报异常无法打开

1、问题现象: 报错部分内容: java.desktop does not export sun.awt.shell to unnamed module 0x78047b92 [in thread "AWT-EventQueue-0"] 报错部分内容: kg.apc.jmeter.reporters.LoadosophiaUploaderGui java.lang.reflect.Invo…

feign设置超时时间

feign设置超时时间 feign的 本质是 调用 http请求,如果不设置超时时间,请求长时间连接着,占用系统资源,影响用户体验。 feign设置超时时间,可以通过 Request.Options 来设置。 FeignClientFactoryBean :…

docker小白第十四天之Portainer与CIG

Portainer简介 Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 Portainer命令安装 # 一个容器可以同时起多个-p端口,restartalways表示随时在线,重启机器后也…

5 Redis主从集群

文章目录 Redis主从集群1.1主从集群搭建1.1.1 伪集群搭建与配置1.1.2 分级管理1.1.3 容灾冷处理 1.2主从复制原理1.2.1 主从复制过程1.2.2 数据同步演变过程 2.1 哨兵机制实现2.1.1 简介2.2.2 Redis 高可用集群搭建2.2.3 Redis 高可用集群的启动2.2.4 Sentinel 优化配置 3.1 哨…

Java数组新手冷知识

J a v a Java Java 中,数组是对象,当你将一个数组传递给方法时,你其实是传递了数组的引用(地址),而不是数组的副本。因此,在 m m m 方法中修改了数组 n n n 的内容后,这种改变在方…

算法笔记p414拓扑排序

目录 有向无环图拓扑排序求拓扑排序步骤代码实现 例题 有向无环图 如果一个有向图的任意顶点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图(DirectedAcyclic Graph,DAG)。 拓扑排序 拓扑排序是将有向无环图G的所…

数字化转型急迫推进,效益提升却难见明显成效!

数字化现已不再是一种选择,而是企业适应市场环境、保持竞争力的必然要求。但是,企业在投入大量人力、物力进行数字化转型后,却常常面临效益不明显的问题,这种现象值得我们深入剖析与探讨。 我们需要明白数字化转型并非简单地购置先…

【知识简略】说说分布式常见问题及解决方案:分布式锁、分布式事务、分布式session、分布式任务调度;

分布式常见问题及解决方案 前言什么是分布式系统分布式系统与微服务两者概念傻傻分不清 1.分布式锁分布式事务分布式Session分布式任务调度 前言 什么是分布式系统 分布式系统(Distributed System)是指由多个独立计算机通过网络通信协议连接起来协同工作,共同完成一…

【Java】POI解析excel

一、相关介绍 POI技术 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 poi-ooxml能解析xls&#xff0c;xlsx。 poi能解析word、ppt、excel、xml等office软件 导入坐标&#xff1a; <depende…

如何使用ArkUI从0-1写一个开发购物应用程序(下)

接下来我们继续学习如何用ArkUI来开发一个购物应用程序&#xff08;下半部分&#xff09; 底部组件是由一个横向的图片列表组成&#xff0c;iconPath是底部初始状态下的3张图片路径数组。遍历iconPath数组&#xff0c;使用Image组件设置图片路径并添加到List中&#xff0c;给每…

【RabbitMQ】【Docker】基于docker-compose构建rabbitmq容器

本文通过docker-compose构建一个单体的rabbtimq容器。 1&#xff0c;docker、docker-compose环境 首先需要有docker和docker-compose环境&#xff0c;docker安装[1]&#xff0c;docker-compose安装[2]。 通过下列命令确定docker、docker-compose是否安装成功。 [root192 ge…

【大屏设计】如何进行软件系统网站大屏页面设计?不限于智慧城市、物联网、电商、园区领域

【大屏设计】如何进行软件系统网站大屏页面设计&#xff1f;不限于智慧城市、物联网、电商、园区领域 一、什么是网站大屏设计二、网站大屏设计原型素材三、网站大屏设计设计素材四、他山之石 一、什么是网站大屏设计 网站大屏设计是网站设计中至关重要的一部分&#xff0c;因…

Ubuntu介绍

Ubuntu&#xff0c;这个源自南非祖鲁语和科萨语的词汇&#xff0c;意为“人类之间的仁慈和善良”。在计算机领域&#xff0c;Ubuntu已经成为了一个广为人知的开源操作系统&#xff0c;它以其易用性、稳定性和强大的社区支持而闻名于世。Ubuntu不仅仅是一个操作系统&#xff0c;…

数据库笔记

1、服务端架构分层&#xff1a;网关层管网络&#xff0c;应用层管业务&#xff0c;存储层管数据 2、Mysql单表数据量超百万查询慢&#xff0c;超千万查不动了 3、高级需要你熟练地使用各种数据库 是多读写少&#xff0c;还是反过来分布式扩展能力解决单机存储的瓶颈问题 4、关…

8种Kubernetes集群中Pod处于 Pending状态的故障排除方法

文章目录 一、Pod与容器二、Pod的阶段&#xff08;状态&#xff09;三、Pod 状态故障排除3.1 检查 Pod 事件3.2 检查资源可用性3.3 检查污点和容忍度3.4 检查节点亲和性设置3.5 检查持久卷声明3.6 检查配额和限制3.7 验证 Pod 和容器映像3.8 分析调度程序日志 四、用于排查 Pen…

Linux 常用命令 cat

Linux 常用命令 cat 作用 用于连接文件并打印到标准输出设备上。也可用于创建文件、显示文件内容等操作。 用法 cat [OPTION]... [FILE]...&#xff0c;参数说明如下&#xff1a; 当未指定 FILE 参数&#xff0c;或者 FILE 参数为 -&#xff0c;则从标准输入读取 -A, --show…

Django动态路由实例

Django动态路由实例 先说需求&#xff1a; 比如我前端有两个按钮&#xff0c;点击按钮1跳转到user1的用户信息页面&#xff0c;按钮2跳转user2用户信息页面&#xff0c;但是他俩共用同一个视图层 直接上代码 路由层 urlpatterns [path(user/<str:username>/, views…