Python多任务处理---多线程

引入   

        生活中,我们在电脑上打开了一个word,    这个word对操作系统来说就是一个进程。我们在进行word操作的时候,比如在你打字的时候,该word同时可以进行文字检查。发现了没,在同一个进程中,我们也可以进行同时操作。这就带来了线程的概念。在一个进程中,要同时干多件事,就需要同时运行多个“子任务”,我们把这些子任务可以叫做线程。​​​​​​​

线程出现的背景及意义 

        线程的出现和意义可以从几个方面来理解,主要包括计算机历史背景的发展、效率和资源管理的需要、以及对并发编程模型的追求。

计算机历史背景

        早期的计算机系统大多是单任务的,即计算机在任何时刻只能执行一个任务。随着计算机技术的发展,人们对计算机的处理能力和效率提出了更高的要求,这促使操作系统向多任务系统发展。在多任务操作系统中,多个任务(进程)可以共享CPU时间,使得计算机资源得到更有效的利用。

效率和资源管理

        进程作为操作系统资源分配和调度的基本单位,拥有独立的地址空间和系统资源。这种设计在隔离性和安全性方面有显著优势,但进程的创建、销毁和切换代价较高,资源开销大。为了减少这种开销,提高系统的并发性和响应速度,线程被引入作为轻量级的进程。

线程(有时被称为轻量级进程)共享同一进程的地址空间和资源,但拥有独立的执行路径和栈空间。这种设计使得线程的创建、销毁和切换的开销远小于进程,从而大大提高了系统的效率。

对并发编程模型的追求

        随着多核处理器的出现和发展,利用并发和并行编程模型来充分利用多核处理器的计算能力变得尤为重要。线程作为实现并发执行的基本单位,使得开发者可以更容易地编写出能够充分利用多核处理器性能的程序。

        线程不仅可以在多核处理器上并行执行,提高程序的执行效率,而且在单核处理器上也能通过时间分片技术实现并发执行,提高响应速度和资源利用率。此外,线程还支持更细粒度的任务划分和更灵活的控制,有助于实现复杂的并发编程模型,如响应式编程、事件驱动编程等。

总结

        线程的出现主要是为了提高程序的执行效率和响应速度,减少操作系统在任务管理上的开销,并更好地利用多核处理器的计算能力。线程使得并发和并行编程成为可能,为开发高性能、高响应速度的应用程序提供了基础。

关键概念和术语

        Python中的多线程编程涉及到一系列的概念和术语。下面列出了一些关键概念,以及如何使用threading模块进行多线程编程的基本示例。  

  • 线程(Thread): 是程序执行中一个单一的顺序控制流程,线程是操作系统处理器能够进行运算调度的最小单位。它被包含在进程之中,一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间),是进程中的实际运作单位。在Python中,threading模块允许我们创建和管理线程。

  • 主线程(Main Thread):Python程序启动时,默认会创建一个线程,称为主线程。程序中的所有代码默认都在主线程中执行,除非显式地创建新的线程。

  • 子线程(Child Thread):通过程序创建的新线程称为子线程。程序可以同时运行多个子线程,以执行并行操作。

  • 线程同步(Thread Synchronization):当多个线程需要共享数据或资源时,需要确保这些共享资源不会同时被多个线程修改,以避免数据不一致或状态混乱的问题。常用的线程同步机制包括锁(Locks)、事件(Events)、条件(Conditions)等。

  • 死锁(Deadlock):当两个或多个线程在等待对方释放资源,而这些资源又被对方占用时,会导致这些线程无限等待,发生死锁。

 多进程和多线程的区别

  1. 多线程可以共享全局变量,多进程不能。
  2. 多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。
  3. 线程共享内存空间;进程的内存是独立的
  4. 同一个进程之间的线程可以直接通信,而两个进程之间的通信需要代理
  5. 一个线程可控制和操作同一进程里的其它线程,进程只能操作子进程
  6. 在多进程中,同一个变量,各自有一份拷贝存在于每一个进程中,互不影响;而多线程中,所有的变量都有线程共享。

   参考:https://www.cnblogs.com/qianqiannian/p/7010909.html

常用代码示例 

创建和启动线程
import threadingdef thread_function(name):print(f"Thread {name} is running")if __name__ == "__main__":# 创建线程my_thread = threading.Thread(target=thread_function, args=("MyThread",))# 启动线程my_thread.start()# 等待线程完成my_thread.join()print("Main    : all done")
使用锁进行线程同步
import threading# 创建一个锁
lock = threading.Lock()def thread_function(name):lock.acquire()  # 获取锁try:print(f"Thread {name} is running")finally:lock.release()  # 释放锁if __name__ == "__main__":for i in range(5):my_thread = threading.Thread(target=thread_function, args=(i,))my_thread.start()my_thread.join()  # 注意:在实际应用中,通常不会在这里立即调用join()
使用with语句简化锁的操作
import threading# 创建一个锁
lock = threading.Lock()def thread_function(name):with lock:print(f"Thread {name} is running")if __name__ == "__main__":for i in range(5):my_thread = threading.Thread(target=thread_function, args=(i,))my_thread.start()my_thread.join()

注意事项

  • 全局解释器锁(GIL):由于Python的全局解释器锁(GIL),在CPython解释器中,即使在多核处理器上,同一时刻只能有一个线程执行Python字节码。这意味着,对于CPU密集型任务,使用多线程并不能达到理想的并行效果。在这种情况下,可以考虑使用多进程(multiprocessing模块)来实现真正的并行计算。
  • I/O密集型任务:对于I/O密集型任务(例如文件读写、网络请求等),多线程可以有效提高程序性能,因为线程可以在等待I/O操作完成时让出CPU,执行其他任务。

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

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

相关文章

【RV1126】瑞芯微RV1126开发板双网口问题

今天新拿到瑞芯微RV1126的开发板,是双网口双百兆接口,内存为2G,emmc flash为32G,一开始无法分辨物理接口和系统的eth是对应的,遂想用ethtool工具来查看网速,发现: ethtool eth0 # 可以正常返回…

Acwing.731 毕业旅行问题(状态压缩动态规划)

题目 小明目前在做一份毕业旅行的规划。 打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。 由于经费有限,小明希望能够通过合理的路线安排尽可能的省些路上的花销。 …

如何在 Debian VPS 上添加、删除和授予用户 sudo 权限

简介 当你启动一个新的服务器时,会创建一个名为 root 的默认账户。这个用户拥有完全的系统访问权限,应该仅用于管理任务。作为 root 用户,你基本上可以对系统做任何操作,这很强大,但也极其危险。Linux 没有“撤销”按…

Leetcode 73 矩阵置零

题目信息 LeetCode地址: . - 力扣(LeetCode) 题目理解 矩阵是m*n的,如果某个元素(i,j)等于0,则将第i行和第j列的所有元素都置零。既然如此,我们可以便利每一个元素,并记录下哪一行哪一列有零。记录完毕后…

【C++进阶】二叉搜索树(来自二叉树的复仇)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 [本节目标] 1. 二叉搜索树…

KaTex 常用公式编辑

原文:https://blog.iyatt.com/?p7854 注:语法上和 Latex 差不多一样,我是因为 WordPress 上使用 WP Githuber MD 插件,才用的 KaTex(插件里面的 LaTex 模块有 bug,无法渲染) 希腊字母 大写代…

MyBatis 参数重复打印的bug

现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…

C++之调用Python

1、配置头文件 Python安装目录下的include目录加入头文件目录。Visual Studio2022中操作路径是:属性–> C/C -> 常规-> 附加包含目录 C:\Users \AppData\Local\Programs\Python\Python39\include 2、配置lib库目录 要将Python39.lib加入编译链接。Visua…

neo4j使用详解(七、cypher数学函数语法——最全参考)

Neo4j系列导航: neo4j及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 5.数学函数 5.1.数值函数 数学函数仅对数字表达式进行运算,如果对任何其他值使用,将返回错误 abs()&#xf…

Nginx 基础

文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是…

【Java八股面试系列】Arraylist和HashMap的底层原理

文章目录 ArrayList源码总:构造方法扩容机制remove HashMap总:构造方法细节问题putVal()方法resize()方法Hash值 HashMap常见问题 ConcurrentHashMap总:putVal()方法自己的测试 为什么重写HashCode和equals ArrayList源码 总: *…

3.28号arm

can总线相关理论 1. 概念 控制器局域网(Controller Area Network,CAN),其特点是可拓展性好,可承受大量数据的高速通信,高度稳定可靠,因此常应用于汽车电子领域、工业自动化、医疗设备等高要求…

Java JSON字符串相关问题

一、依赖包 <!--json包--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15</version></dependency> 二、举例 1.实体对象转Json字符串 1.1 代码实现 Dog.java: pack…

python_web1(前端开发之HTML、CSS、Bootstap、Javascript、JQuery)

文章目录 一、Flask网页开发1.1创建一个名为web1.py的python文件1.2 templates目录创建文件index.html 二、html标签2.1 编码2.2title < head >2.3 标题< h>2.4 div和span2.5超链接1.在index.xml文件中补充。2.修改web1.py文件3.添加get_self.html4.效果 2.6图片1.…

Java 堆外内存及调优

文章目录 直接内存简介为什么DirectByteBuffer可以优化 IO 性能 直接内存的分配直接内存的回收直接内存跟踪与诊断 直接内存简介 直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分&#xff0c;并非Java虚拟机规范中定义的内存区域。但是这部分内存的频繁使用&#x…

ElasticSearch的DSL查询

ElasticSearch的DSL查询 准备工作 创建测试方法&#xff0c;初始化测试结构。 import org.apache.http.HttpHost; import org.apache.lucene.search.TotalHits; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRespo…

AcWing22. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个升序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。 例如数组 {3,4,5,1,2}为 {1,2,3,4,5} 的一个旋转&#xff0c;该数组的最小值为 1。 数组可能包含重复项。 注意&#x…

【LeetCode】三月题解

文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…

C++教学——从入门到精通 5.单精度实数float

众所周知&#xff0c;三角形的面积公式是(底*高)/2 那就来做个三角形面积计算器吧 到吗如下 #include"bits/stdc.h" using namespace std; int main(){int a,b;cin>>a>>b;cout<<(a*b)/2; } 这不对呀&#xff0c;明明是7.5而他却是7&#xff0c;…

ntp服务器搭建

1、手动修改时区 CST可以为如下4个不同的时区的缩写&#xff1a; 美国中部时间&#xff1a;Central Standard Time (USA) UT-6:00 澳大利亚中部时间&#xff1a;Central Standard Time (Australia) UT9:30 中国标准时间&#xff1a;China Standard Time UT8:00 古巴标准时间&a…