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.rhkb.cn/news/293530.html

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

相关文章

Rust 02.控制、引用、切片Slice、智能指针

1.控制流 //rust通过所有权机制来管理内存,编译器在编译就会根据所有权规则对内存的使用进行 //堆和栈 //编译的时候数据的类型大小是固定的,就是分配在栈上的 //编译的时候数据类型大小不固定,就是分配堆上的 fn main() {let x: i32 1;{le…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率( A c c u r a c y Accuracy Accuracy) 二分类查准率 P r e c i s i o n Precision Precision,查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

linux 一些命令

文章目录 linux 一些命令fdisk 磁盘分区parted 分区文件系统mkfs 格式化文件系统fsck 修复文件系统 mount 挂载swap 交换分区清除linux缓存df du 命令raid 命令基本原理硬raid 和 软raid案例raid 10 故障修复,重启与卸载 lvm逻辑卷技术LVM的使用方式LVM 常见名词解析…

书生·浦语大模型-第一节课笔记

视频总结 23年发布的模型在一些材料中归位指令微调模型,后面逐渐升级应该已经是train的模型了 技术报告总结 InternLM2 Technical Report 评测与特点 6 dimensions and 30 benchmarks, long-context modeling, and open-ended subjective evaluations长文本…

与鲸同行,智领未来!和鲸科技“人工智能+X”学科建设合作交流会(北京站)圆满结束!

在国家加快发展新质生产力的大背景下,3月25日下午,和鲸科技 2024 年“人工智能X”学科建设合作交流会(北京站)暨“AIX”实验室建设与供应商选型座谈会顺利召开。为提供更为集中和专业的讨论环境,本次会议特别采取闭门审…

环境温度对测量平板有什么影响

环境温度可以对测量平板有影响。温度变化可以导致平板的尺寸发生变化。根据热膨胀原理,当环境温度升高时,平板的尺寸会扩大;当环境温度降低时,平板的尺寸会缩小。这种尺寸变化可能会导致测量结果的误差。因此,在测量平…

【蓝桥杯第十三届省赛B】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

一文了解JAVA的常用API

目录 常用kpimathSystemRuntimeObjectObjectsBigIntegerBigDecima正则表达式包装类 常用kpi 学习目的&#xff1a; 了解类名和类的作用养成查阅api文档的习惯 math 工具类。因为是工具类&#xff0c;因此直接通过类名.方法名(形参)即可直接调用 abs&#xff1a;获取参数绝对…

flume配置文件后不能跟注释!!

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释&#xff0c;可以单起一行写注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

内网穿透时报错【Bad Request This combination of host and port requires TLS.】的原因

目录 前言&#xff1a;介绍一下内网穿透 1.内网直接https访问&#xff08;可以正常访问&#xff09; 程序配置的证书 2.内网穿透后,通过外网访问 3.原因 4.内网非https的Web应用&#xff0c;使用https后&#xff0c;也变成了https访问 5.题外话 感觉自己的web应用配置了…

axios post请求参数传输表单数据,其中一个key的value需要json格式, (qs的使用知识扩充)

今天遇到了一个场景&#xff0c;post请求&#xff0c;请求体的content-type是application/x-www-form-urlencoded&#xff0c;然后我按照往常的情况直接设置完&#xff0c;接口参数进行qs.stringify操作。转成表单的格式传输给后端&#xff0c;但是在浏览器中查看接口参数发现是…

极危!XZ Utils 5.6.0/5.6.1版本恶意后门植入漏洞风险通告

前日&#xff0c;亚信安全CERT监控到安全社区发布安全通告&#xff0c;披露XZ Utils 5.6.0、5.6.1版本存在恶意后门植入漏洞&#xff08;CVE-2024-3094&#xff09;。开发人员在调查SSH性能问题时发现了涉及XZ Utils的供应链攻击。从 5.6.0 版开始&#xff0c;在 xz 的上游libl…

【小黑送书—第十八期】>>让工作自动化起来!无所不能的Python(文末送书)

随着我国企业数字化和信息化的深入&#xff0c;企业对办公自动化的效率和灵活性要求越来越高。Python作为一种开源的软件应用开发方式&#xff0c;通过提供强大丰富的库文件包&#xff0c;极大地简化了应用开发过程&#xff0c;降低了技术门槛。Python开发有哪些优势、挑战以及…

OpenELB使用分析

前言 OpenELB 是由青云科技开源的云原生负载均衡器&#xff0c;可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。核心功能包括&#xff1a; BGP 模式和二层网络模式下的负载均衡基于路由器 ECMP 的负载均衡IP 地…

Tuxera for Mac产品2024最新版本功能描述优化介绍

Tuxera for Mac产品描述优化 Tuxera for Mac&#xff0c;是Mac用户的专属读写神器。无论你是职场人士还是学生&#xff0c;只要你在Mac上工作、学习&#xff0c;需要频繁读写Windows格式的存储设备&#xff0c;Tuxera for Mac都将是你的不二之选。 Tuxera Ntfs For Mac 2024下…

密码算法概论

基本概念 什么是密码学&#xff1f; 简单来说&#xff0c;密码学就是研究编制密码和破译密码的技术科学 例题&#xff1a; 密码学的三个阶段 古代到1949年&#xff1a;具有艺术性的科学1949到1975年&#xff1a;IBM制定了加密标准DES1976至今&#xff1a;1976年开创了公钥密…

unbuntu mysql8.0新建用户及开启远程连接

MySQL更新到8.0以上版本后&#xff0c;在创建连接远程的用户的时候和之前5.x的版本有了很大的不同&#xff0c;不能使用原来同时创建用户和授权的命令。 以下是记录的MySQL8.0创建用户并授权的命令&#xff1a; 查看用户表&#xff1a; user mysql; select host,user,authen…

算法系列--递归,回溯,剪枝的综合应用(2)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(2) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(2) 一.括号…

Java的IDEA的工程管理

模块和包的图标&#xff1a; 举个例子&#xff1a; IDEA中创建包&#xff1a; 如图所示&#xff0c;com.LBJ的意思是在com包中创建子包LBJ 参见&#xff1a; IDEA中项目、模块和包的关系_idea中模块和项目-CSDN博客

llama-index 结合chatglm3-6B 利用RAG 基于文档智能问答

简介 llamaindex结合chatglm3使用 import os import torch from llama_index.core import VectorStoreIndex, ServiceContext from llama_index.core.callbacks import CallbackManager from llama_index.core.llms.callbacks import llm_completion_callback from llama_ind…