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)&…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
