当前位置: 首页 > 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;&…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...