Python并发编程 04 进程与线程基础
文章目录
- 一、操作系统简介
- 二、进程
- 三、线程
- 四、线程的调用
- 1、示例
- 2、join方法
- 3、setDaemon方法
- 4、继承式调用(不推荐)
- 5、其他方法
一、操作系统简介
①操作系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用程序之间。它可以向上给程序员提供管理硬件的接口,方便编写应用程序。
②操作系统内核是一个管理和控制程序,负责管理计算机所有物理资源,其中包括:文件系统、内存管理、设备管理和进程管理。
二、进程
①进程是一个程序在一个数据集上的一次动态执行过程。
②进程一般由程序、数据集、进程控制块三部分组成。
③进程控制块是用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程。它是系统感知进程存在的唯一标识。
三、线程
①进程是最小的资源单位。线程是最小执行单元。进程是线程的容器,线程是进程的一个实体。
②一个运行的程序至少有一个进程,一个进程至少有一个线程。
③进程在执行过程中拥有独立的内存单元,而多个线程共享其内存。
④线程在执行中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序出口。但是线程不能独立于进程存在。
⑤一个线程可以创建和撤销另一个线程。
⑥同一个进程中的多个线程之间可以并发执行。
四、线程的调用
1、示例
import threading
import timedef Hi(num):print("hello %d\n" %num,end='')time.sleep(3)if __name__ == "__main__":t1 = threading.Thread(target=Hi, args=(10,)) # 主线程创建了一个子线程对象t1.start() # 子线程t1运行函数H1t2 = threading.Thread(target=Hi, args=(9,)) # 主线程创建了一个子线程对象t2.start() # 子线程t2运行函数H1print("ending",end='')
**上述代码分析:**主线程按照顺序从上到下顺序执行,主线程开设子线程后,与子线程并发运行。所以上述代码会先输出:
hello 10
hello 9
ending
然后等待三秒,程序运行结束。
2、join方法
join方法:在子进程完成运行之前,这个子进程的父进程一直被阻塞。
import threading
import timedef music():print("begin to listen %s\n" %time.strftime("%X"),end="")time.sleep(3)print("stop to listen %s\n" %time.strftime("%X"),end="")def game():print("begin to game %s\n" %time.strftime("%X"),end="")time.sleep(6)print("stop to game %s\n" %time.strftime("%X"),end="")if __name__ == "__main__":t1 = threading.Thread(target=music) # 主线程创建了一个子线程对象t1.start() # 子线程t1运行函数H1t2 = threading.Thread(target=game) # 主线程创建了一个子线程对象t2.start() # 子线程t2运行函数H1t1.join() # 阻塞主线程,主线程会等待t1线程执行完毕后再继续往下执行print("ending %s\n" %time.strftime("%X"),end='')'''
begin to listen 15:04:40
begin to game 15:04:40
stop to listen 15:04:43
ending 15:04:43
stop to game 15:04:46
'''
import threading
import timedef music():print("begin to listen %s\n"%time.strftime("%X"),end="")time.sleep(5)print("stop to listen %s\n" % time.strftime("%X"),end="")def game():time.sleep(1)t3=threading.Thread(target=music)t3.start()print("begin to play game %s\n"%time.strftime("%X"),end="")time.sleep(3)print("stop to play game %s\n" % time.strftime("%X"),end="")if __name__ == '__main__':t1= threading.Thread(target=music)t2 = threading.Thread(target=game)t1.start()t2.start()t1.join()t2.join()print("ending %s\n" %time.strftime("%X"),end="")'''
begin to listen 15:29:44
begin to listen 15:29:45
begin to play game 15:29:45
stop to play game 15:29:48
stop to listen 15:29:49
ending 15:29:49
stop to listen 15:29:50
'''
import threading
import timedef music():print("begin to listen %s\n"%time.strftime("%X"),end="")time.sleep(5)print("stop to listen %s\n" % time.strftime("%X"),end="")def game():time.sleep(1)t3=threading.Thread(target=music)t3.start()t3.join()print("begin to play game %s\n"%time.strftime("%X"),end="")time.sleep(3)print("stop to play game %s\n" % time.strftime("%X"),end="")if __name__ == '__main__':t1= threading.Thread(target=music)t2 = threading.Thread(target=game)t1.start()t2.start()t1.join()print("ending %s\n" %time.strftime("%X"),end="")'''
begin to listen 15:35:54
begin to listen 15:35:55
stop to listen 15:35:59
ending 15:35:59
stop to listen 15:36:00
begin to play game 15:36:00
stop to play game 15:36:03
'''
3、setDaemon方法
setDaemon方法:将线程声明为守护线程,必须在start()方法调用之前设置,将子线程设置为守护线程后,主线程只要完成了,子线程就会和主线程一起退出。该方法基本与join方法是相反的。
import threading
from time import ctime,sleep
import timedef ListenMusic(name):print("Beign listening to %s %s\n" %(name,time.strftime("%X")), end="")sleep(3)print("end listening %s\n" %time.strftime("%X"), end="")def RecordBlog(title):print("Begin recording the %s %s\n" %(title,time.strftime("%X")),end="")sleep(5)print("end recording %s\n" %time.strftime("%X"), end="")threads = []t1 = threading.Thread(target=ListenMusic, args=("水手",))
t2 = threading.Thread(target=RecordBlog, args=("python线程",))threads.append(t1)
threads.append(t2)if __name__ == "__main__":t1.setDaemon(True)for t in threads:t.start()print("all over %s\n" %time.strftime("%X"), end="")'''
Beign listening to 水手 01:22:27
Begin recording the python线程 01:22:27
all over 01:22:27
end listening 01:22:30
end recording 01:22:32
'''
import threading
from time import ctime,sleep
import timedef ListenMusic(name):print("Beign listening to %s %s\n" %(name,time.strftime("%X")), end="")sleep(3)print("end listening %s\n" %time.strftime("%X"), end="")def RecordBlog(title):print("Begin recording the %s %s\n" %(title,time.strftime("%X")),end="")sleep(5)print("end recording %s\n" %time.strftime("%X"), end="")threads = []t1 = threading.Thread(target=ListenMusic, args=("水手",))
t2 = threading.Thread(target=RecordBlog, args=("python线程",))threads.append(t1)
threads.append(t2)if __name__ == "__main__":t2.setDaemon(True)for t in threads:t.start()print("all over %s\n" %time.strftime("%X"), end="")'''
Beign listening to 水手 01:23:23
Begin recording the python线程 01:23:23
all over 01:23:23
end listening 01:23:26
'''
4、继承式调用(不推荐)
import threading
import timeclass MyThread(threading.Thread):def __init__(self, num):threading.Thread.__init__(self)self.num = numdef run(self): # # run方法是重写的方法,线程对象执行start方法要运行的该函数print("running on number:%s, %s\n" % (self.num, time.strftime("%X")), end="")time.sleep(3)print("结束:%s, %s\n" % (self.num,time.strftime("%X")), end="")if __name__ == "__main__":t1 = MyThread(1)t2 = MyThread(2)t1.start()t2.start()print("ending %s\n" % time.strftime("%X"), end="")'''
running on number:1, 22:36:46
running on number:2, 22:36:46
ending 22:36:46
结束:2, 22:36:49
结束:1, 22:36:49
'''
5、其他方法
is_alive() 返回线程是否活动的
getName() 返回线程名
setName() 设置线程名
import threading
import timedef test():time.sleep(2)t1 = threading.Thread(target=test)
t1.start()
print(t1.is_alive()) # True
print(t1.getName()) # Thread-1
t1.setName("T1")
print(t1.getName()) # T1
threading模块提供的一些方法
threading.currentThread() 返回当前的线程变量
import threading
import timedef test():time.sleep(2)print(threading.currentThread()) # <Thread(Thread-1, started 16028)>t1 = threading.Thread(target=test)
t1.start()
print(threading.currentThread()) # <_MainThread(MainThread, started 14244)>
threading.enumerate() 返回一个包含正在运行的线程的列表
import threading
import timedef test():time.sleep(2)t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t1.start()
t2.start()print(threading.enumerate())
# [<_MainThread(MainThread, started 26852)>, <Thread(Thread-1, started 24396)>, <Thread(Thread-2, started 15376)>]
threading.active_count() 返回正在运行的线程数量
import threading
import timedef test():time.sleep(2)t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t1.start()
t2.start()print(threading.active_count()) # 3
相关文章:
Python并发编程 04 进程与线程基础
文章目录 一、操作系统简介二、进程三、线程四、线程的调用1、示例2、join方法3、setDaemon方法4、继承式调用(不推荐)5、其他方法 一、操作系统简介 ①操作系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序,它位于硬件和应用…...
模板引擎Freemarker
什么是模板引擎 根据前边的数据模型分析,课程预览就是把课程的相关信息进行整合,在课程预览界面进行展示,课程预览界面与课程发布的课程详情界面一致。 项目采用模板引擎技术实现课程预览界面。什么是模板引擎? 早期我们采用的…...
刷题训练之模拟
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:熟练掌握模拟算法。 > 毒鸡汤:学习,学习,再学习 ! 学,然后知不足。 > 专栏选自:刷题训…...
视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享
目录 一、JT/T 808标准简介 (一)概述 (二)协议特点 1、通信方式 2、鉴权机制 3、消息分类 (三)协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 (一…...
【C++】多态 — 多态的细节补充(下篇)
前言: 我们学习了多态的形式和如何使用多态,这一章我们将来讲一讲多态的原理… 目录 动态绑定与静态绑定: 动态绑定与静态绑定: 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,比如…...
系统安全与应用【2】
1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB 菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。 实例&…...
EtherCAT总线速度轴控制功能块(COSESYS ST源代码)
测试环境为汇川PLC,型号 AM402-CPU1608TP、伺服驱动器为禾川X3E,具体通信配置可以参考下面文章链接: 1、使能和点动控制 汇川AM400PLC通过EtherCAT总线控制禾川X3E伺服使能和点动控制-CSDN博客文章浏览阅读31次。进行通信之前需要安装禾川X3E的XML文件,具体方法如下:1、汇…...
【码银送书第十九期】《图算法:行业应用与实践》
作者:嬴图团队 01 前言 在当今工业领域,图思维方式与图数据技术的应用日益广泛,成为图数据探索、挖掘与应用的坚实基础。本文旨在分享嬴图团队在算法实践应用中的宝贵经验与深刻思考,不仅促进业界爱好者之间的交流,…...
无监督式学习
1.是什么? 无监督式学习与监督式学习**最大的区别就是:**没有事先给定的训练实例,它是自动对输入的示例进行分类或者分群; 优点:不需要标签数据,极大程度上扩大了我们的数据样本,其次不受监督信…...
docker 安装镜像及使用命令
目录 1. Mysql2. Redis3. Nginx4. Elasticsearch官网指导 docker pull 容器名:版本号 拉取容器, 不指定版本号默认最新的 run 运行 -d 后台运行 -p 3306:3306 -p是port 对外端口:对内端口 –name xyy_mysql 容器名称 -e MYSQL_ROOT_PASSWORD123456 环境变量 -v 系统地址:docker…...
Python运维之多进程!!
本节的快速导航目录如下喔!!! 一、创建进程的类Process 二、进程并发控制之Semaphore 三、进程同步之Lock 四、进程同步之Event 五、进程优先队列Queue 六、多进程之进程池Pool 七、多进程之数据交换Pipe 一、创建进程的类Process mu…...
Redis(无中心化集群搭建)
文章目录 1.无中心化集群1.基本介绍2.集群说明 2.基本环境搭建1.部署规划(6台服务器)2.首先删除上次的rdb和aof文件(对之前的三台服务器都操作)1.首先分别登录命令行,关闭redis2.清除/root/下的rdb和aof文件3.把上次的…...
基于springboot+jsp+Mysql的商务安全邮箱邮件收发
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
三.Django--ORM(操作数据库)
目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…...
【华为】AC直连二层组网隧道转发实验配置
【华为】AC直连二层组网隧道转发实验配置 实验需求拓扑配置AC数据规划表 AC的配置顺序AC1基本配置(二层通信)AP上线VAP组关联--WLAN业务流量 LSW1AR1STA获取AP的业务流量 配置文档 实验需求 AC组网方式:直连二层组网。 业务数据转发方式:隧道转发。 DHC…...
第 129 场 LeetCode 双周赛题解
A 构造相同颜色的正方形 枚举:枚举每个 3 3 3\times 3 33的矩阵,判断是否满足条件 class Solution {public:bool canMakeSquare(vector<vector<char>>& grid) {for (int i 0; i < 2; i)for (int j 0; j < 2; j) {int c1 0, c…...
GStreamer日志调试笔记
1、查询所有分类 #gst-launch-1.0 --gst-debug-help 2、查询videotestsrc的日志 #gst-launch-1.0 --gst-debug-help | findstr videotestsrc 结果: 3、使用--gst-debug设置相应日志类型的相应等级,越大显示日志越多,排查内存泄露可以设置为9 …...
【api接口开通教程】YouTube Data API v3申请流程
一、背景调查 1.1 API接口介绍 采集youtube数据,大体分为两种方案:一种是基于爬虫,一种是基于API接口。 说人话就是:爬虫相当于走后门、爬窗户(利用技术手段窃取,人家没说给,但我硬拿&#x…...
.net 6.0 框架集成ef实战,步骤详解
一、代码框架搭建 搭建如下代码架构: 重点含EntityFrameworkCore工程,该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCo…...
[C/C++] -- 观察者模式
观察者模式是一种行为型设计模式,用于定义对象间的一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式涉及以下几个角色: 主题(Subject)&…...
嵌入式C中结构体嵌套联合体的内存优化实践
1. 结构体与联合体共用的工程实践解析在嵌入式系统开发中,内存资源往往高度受限,如何在保证代码可读性与功能完整性的前提下,实现内存使用的最优化,是每一位硬件工程师和固件开发者必须面对的核心问题。结构体(struct&…...
cv_resnet101_face-detection_cvpr22papermogface 实战:集成OpenCV实现实时视频流人脸检测
cv_resnet101_face-detection_cvpr22papermogface 实战:集成OpenCV实现实时视频流人脸检测 1. 引言 你有没有想过,那些商场里能统计客流、手机里能自动对焦人脸拍照、甚至一些智能门禁系统能认出你是谁的技术,背后是怎么实现的?…...
Audio Pixel Studio实战案例:自媒体博主短视频口播语音自动合成工作流
Audio Pixel Studio实战案例:自媒体博主短视频口播语音自动合成工作流 1. 引言:自媒体语音制作的痛点与解决方案 短视频创作已经成为自媒体博主的主要内容形式之一。每天需要录制大量口播内容,传统方式面临几个核心问题: 录制效…...
读领域到底适合构建什么样的 Zero-Party Data 产品?海外有没有接近的实例?
核心判断:严肃阅读的 Zero-Party Data,不该做“娱乐化”,而该做“判断外显化” 对于严肃阅读,读者愿意主动提供的数据,通常不是“我喜欢哪种书封”“你是哪种阅读人格”,而是这些更有认知含量的东西&#x…...
LoRA训练助手快速体验:Colab免费GPU 5分钟跑通Qwen3-32B标签生成Demo
LoRA训练助手快速体验:Colab免费GPU 5分钟跑通Qwen3-32B标签生成Demo 你是不是也遇到过这样的烦恼:想训练一个自己的LoRA模型,却卡在了第一步——给图片打标签。手动写英文标签,既要准确描述画面,又要符合训练格式&am…...
Pixel Dimension Fissioner生产环境:K8s集群部署+Prometheus监控裂变服务SLA
Pixel Dimension Fissioner生产环境:K8s集群部署Prometheus监控裂变服务SLA 1. 产品概述 像素语言维度裂变器(Pixel Dimension Fissioner)是一款基于MT5-Zero-Shot-Augment核心引擎构建的高端文本改写与增强工具。它将传统AI文本处理能力重构为充满活力的16-bit像…...
用丹青幻境做汉服设计:轻松生成唐代齐胸襦裙、宋代褙子等各朝代服饰
用丹青幻境做汉服设计:轻松生成唐代齐胸襦裙、宋代褙子等各朝代服饰 1. 丹青幻境与汉服设计的完美结合 丹青幻境Z-Image Atelier是一款专为数字艺术创作设计的AI工具,它将现代AI技术与传统东方美学完美融合。这款工具基于先进的Z-Image架构,…...
Qwen3-32B-Chat企业安全合规部署:模型离线运行、数据不出域、API鉴权配置
Qwen3-32B-Chat企业安全合规部署:模型离线运行、数据不出域、API鉴权配置 1. 私有部署方案概述 Qwen3-32B-Chat作为当前领先的开源大语言模型,在企业级应用中面临三大核心需求:模型离线运行保障业务连续性、数据不出域满足合规要求、API访问…...
BGE Reranker-v2-m3模型压缩技术:减小部署体积50%
BGE Reranker-v2-m3模型压缩技术:减小部署体积50% 如果你正在为RAG系统寻找一个既轻量又高效的重排序模型,那么BGE Reranker-v2-m3绝对值得你关注。这个模型最大的特点就是“小”——参数只有5.68亿,但性能却相当能打。 不过,在…...
Qwen-Image镜像真实案例:RTX4090D助力设计师快速解析竞品App截图并生成UI建议
Qwen-Image镜像真实案例:RTX4090D助力设计师快速解析竞品App截图并生成UI建议 1. 设计师的新利器:当Qwen-Image遇上RTX4090D 作为一名UI设计师,你是否经常需要分析竞品App的界面设计?传统方法需要手动截图、标注、分析ÿ…...
