当前位置: 首页 > news >正文

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、继承式调用&#xff08;不推荐&#xff09;5、其他方法 一、操作系统简介 ①操作系统是一个用来协调、管理和控制计算机硬件和软件资源的系统程序&#xff0c;它位于硬件和应用…...

模板引擎Freemarker

什么是模板引擎 根据前边的数据模型分析&#xff0c;课程预览就是把课程的相关信息进行整合&#xff0c;在课程预览界面进行展示&#xff0c;课程预览界面与课程发布的课程详情界面一致。 项目采用模板引擎技术实现课程预览界面。什么是模板引擎&#xff1f; 早期我们采用的…...

刷题训练之模拟

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握模拟算法。 > 毒鸡汤&#xff1a;学习&#xff0c;学习&#xff0c;再学习 ! 学&#xff0c;然后知不足。 > 专栏选自&#xff1a;刷题训…...

视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;协议特点 1、通信方式 2、鉴权机制 3、消息分类 &#xff08;三&#xff09;协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 &#xff08;一…...

【C++】多态 — 多态的细节补充(下篇)

前言&#xff1a; 我们学习了多态的形式和如何使用多态&#xff0c;这一章我们将来讲一讲多态的原理… 目录 动态绑定与静态绑定: 动态绑定与静态绑定: 静态绑定又称为前期绑定(早绑定)&#xff0c;在程序编译期间确定了程序的行为&#xff0c;也称为静态多态&#xff0c;比如…...

系统安全与应用【2】

1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情况下在系统开机进入GRUB菜单时&#xff0c;按e键可以查看并修改GRUB引导参数&#xff0c;这对服务器是一个极大的威胁。可以为GRUB 菜单设置一个密码&#xff0c;只有提供正确的密码才被允许修改引导参数。 实例&…...

EtherCAT总线速度轴控制功能块(COSESYS ST源代码)

测试环境为汇川PLC,型号 AM402-CPU1608TP、伺服驱动器为禾川X3E,具体通信配置可以参考下面文章链接: 1、使能和点动控制 汇川AM400PLC通过EtherCAT总线控制禾川X3E伺服使能和点动控制-CSDN博客文章浏览阅读31次。进行通信之前需要安装禾川X3E的XML文件,具体方法如下:1、汇…...

【码银送书第十九期】《图算法:行业应用与实践》

作者&#xff1a;嬴图团队 01 前言 在当今工业领域&#xff0c;图思维方式与图数据技术的应用日益广泛&#xff0c;成为图数据探索、挖掘与应用的坚实基础。本文旨在分享嬴图团队在算法实践应用中的宝贵经验与深刻思考&#xff0c;不仅促进业界爱好者之间的交流&#xff0c;…...

无监督式学习

1.是什么&#xff1f; 无监督式学习与监督式学习**最大的区别就是&#xff1a;**没有事先给定的训练实例&#xff0c;它是自动对输入的示例进行分类或者分群&#xff1b; 优点&#xff1a;不需要标签数据&#xff0c;极大程度上扩大了我们的数据样本&#xff0c;其次不受监督信…...

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运维之多进程!!

本节的快速导航目录如下喔&#xff01;&#xff01;&#xff01; 一、创建进程的类Process 二、进程并发控制之Semaphore 三、进程同步之Lock 四、进程同步之Event 五、进程优先队列Queue 六、多进程之进程池Pool 七、多进程之数据交换Pipe 一、创建进程的类Process mu…...

Redis(无中心化集群搭建)

文章目录 1.无中心化集群1.基本介绍2.集群说明 2.基本环境搭建1.部署规划&#xff08;6台服务器&#xff09;2.首先删除上次的rdb和aof文件&#xff08;对之前的三台服务器都操作&#xff09;1.首先分别登录命令行&#xff0c;关闭redis2.清除/root/下的rdb和aof文件3.把上次的…...

基于springboot+jsp+Mysql的商务安全邮箱邮件收发

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

三.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组网方式&#xff1a;直连二层组网。 业务数据转发方式&#xff1a;隧道转发。 DHC…...

第 129 场 LeetCode 双周赛题解

A 构造相同颜色的正方形 枚举&#xff1a;枚举每个 3 3 3\times 3 33的矩阵&#xff0c;判断是否满足条件 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 结果&#xff1a; 3、使用--gst-debug设置相应日志类型的相应等级&#xff0c;越大显示日志越多&#xff0c;排查内存泄露可以设置为9 …...

【api接口开通教程】YouTube Data API v3申请流程

一、背景调查 1.1 API接口介绍 采集youtube数据&#xff0c;大体分为两种方案&#xff1a;一种是基于爬虫&#xff0c;一种是基于API接口。 说人话就是&#xff1a;爬虫相当于走后门、爬窗户&#xff08;利用技术手段窃取&#xff0c;人家没说给&#xff0c;但我硬拿&#x…...

.net 6.0 框架集成ef实战,步骤详解

一、代码框架搭建 搭建如下代码架构&#xff1a; 重点含EntityFrameworkCore工程&#xff0c;该工程中包含AppDbContext.cs和数据表实体AggregateObject 1、AppDbContext 代码案例 //AppDbContext 代码案例using Microsoft.EntityFrameworkCore;namespace EntityFrameworkCo…...

[C/C++] -- 观察者模式

观察者模式是一种行为型设计模式&#xff0c;用于定义对象间的一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 观察者模式涉及以下几个角色&#xff1a; 主题&#xff08;Subject&#xff09;&…...

数据科学家的懒人包:OpenClaw+nanobot自动清洗CSV并生成可视化报告

数据科学家的懒人包&#xff1a;OpenClawnanobot自动清洗CSV并生成可视化报告 1. 为什么需要自动化数据清洗与报告生成&#xff1f; 作为一名经常处理数据的人&#xff0c;我发现自己每周都在重复同样的工作&#xff1a;收到CSV文件→检查格式→处理缺失值→生成可视化→发送…...

这是什么编码 - writeup by AI

这是什么编码 - writeup by AI &#x1f4cb; 题目信息项目内容题目名称这是什么编码来源平台BUGKU CTF题目类型Crypto (密码学)核心考点Base 家族编码识别、多层嵌套解码涉及编码Hex、Base32、Base64 &#x1f3af; 题目描述 给定的密文文件 encode.txt 中包含一串经过多重编码…...

基于SEER‘S EYE的Java面试题智能解析与模拟面试实战

基于SEERS EYE的Java面试题智能解析与模拟面试实战 最近和几个正在找工作的朋友聊天&#xff0c;发现大家准备Java面试的过程都挺痛苦的。要么是面对网上浩如烟海的“八股文”不知道从哪开始&#xff0c;要么就是自己闷头刷题&#xff0c;缺少真实的对话反馈&#xff0c;心里没…...

大模型提升垃圾邮件识别精度

大模型在垃圾邮件识别与处理中的应用进展与技术优化 问题解构 核心任务识别&#xff1a;问题核心在于了解大模型&#xff08;Large Language Models, LLMs&#xff09;在“垃圾邮件识别”这一经典文本分类任务上的最新应用进展&#xff0c;可能包括准确率提升、新技术应用、处…...

5分钟部署MTools:功能强大的现代化工具,支持Windows/macOS/Linux

5分钟部署MTools&#xff1a;功能强大的现代化工具&#xff0c;支持Windows/macOS/Linux 1. 开箱即用的全能工具集 MTools是一款真正实现"下载即用"的现代化桌面工具集&#xff0c;它集成了图片处理、音视频编辑、AI智能工具和开发辅助四大核心功能模块。不同于需要…...

家庭实验室方案:树莓派控制OpenClaw调用远程Qwen3-32B服务

家庭实验室方案&#xff1a;树莓派控制OpenClaw调用远程Qwen3-32B服务 1. 为什么选择树莓派OpenClaw组合 去年冬天&#xff0c;当我试图用语音控制家里的智能设备时&#xff0c;发现市面上的解决方案要么需要持续联网&#xff08;隐私堪忧&#xff09;&#xff0c;要么响应延…...

MySQL存储图片旋转元数据的最佳实践

MySQL存储图片旋转元数据的最佳实践 1. 引言 在日常应用中&#xff0c;我们经常遇到这样的场景&#xff1a;用户上传的图片在显示时方向不正确&#xff0c;需要根据EXIF信息中的旋转角度进行自动校正。比如手机拍摄的照片&#xff0c;由于设备方向不同&#xff0c;可能包含90…...

CogVideoX-2b效果实测:中文vs英文提示词生成质量差异分析

CogVideoX-2b效果实测&#xff1a;中文vs英文提示词生成质量差异分析 1. 引言&#xff1a;当AI导演遇到不同语言 想象一下&#xff0c;你有一个能听懂你说话、并把你描述的场景变成视频的AI导演。你告诉它&#xff1a;“一个宇航员在月球上漫步&#xff0c;远处是蓝色的地球。…...

英伟达黄仁勋力荐!2026年AI Agent元年,掌握这5大关键技术,成为行业风口!

0****1 什么是AI Agent&#xff1f; 随着人工智能技术加速演进&#xff0c;AI Agent&#xff08;人工智能代理&#xff0c;常称智能体&#xff09;正悄然渗透到企业运营与日常生活的各个角落&#xff0c;从大家熟悉的虚拟助手&#xff08;如Siri、小爱同学、豆包&#xff09;&a…...

Android Perfetto 系列 6:为什么是 120Hz?高刷新率的优势与挑战

Android Perfetto 系列 6&#xff1a;为什么是 120Hz&#xff1f;高刷新率的优势与挑战本文是 Android Perfetto 系列的第六篇&#xff0c;主要介绍 Android 设备上 120Hz 刷新率的相关知识。如今&#xff0c;120Hz 已成为 Android 旗舰手机的标配&#xff0c;本文将讨论高刷新…...