python自学之《21天学通Python》(12)——第15章 线程和进程

news2025/7/9 10:08:57

现代操作系统大多都是多任务的,可以同时执行多个程序。进程是应用程序正在执行的实体,当程序执行时,也就创建了一个主线程。进程在创建和执行时需要一定的资源,比如内存、文件、I/O设备等。大多现代操作系统中支持多线程和进程。线程是CPU使用的基本单元,由主线程来创建,并使用这个进程的资源,因此线程创建成本低而且可以实现并行处理,充分利用CPU。

15.1 线程

Python3对多线程支持的是threading模块,应用这个模块,可以创建多线程程序,并且在多线程间进行同步和通信。在Python3中,可以通过以两种方式来创建线程。即通过threading.Thread直接在线程中运行函数;通过继承threading.Thread类来创建线程。

15.1.1 用threading.Thread直接在线程中运行函数

threading.Thread的基本使用方法如下:

在这里插入图片描述
在这里插入图片描述
15.1.2 通过继承threading.Thread类来创建线程

这种方法只要重载threading.Thread类的run方法,然后调用类的start()就能够创建线程,并运行run()函数中的代码。

【实例15-2】 预定义了一个函数,并以线程方式来运行,代码如下:

在这里插入图片描述
注意:继承threading.Thread类的子类中,如果需要重载__init__()方法,必须首先调用父类的__init__()方法。否则会引发AttributeError异常。

15.1.3 线程类Thread使用

在这里插入图片描述
join()方法作用是当某个线程或函数执行时需等另一个线程完成操作后才能继续,则应调用另一个线程的join()方法;其中的可选参数timeout用于指定线程运行的最长时间。isAlive()方法用于查看线程是否运行。

name属性是线程设置的线程名;daemon属性用来设置线程是否随主线程退出而退出,一般来说,其属性值为True时不会随主线程退出而退出。

在这里插入图片描述
在这里插入图片描述
注意:tb线程初始化只能在ta线程初始化之后,因为没有初始化的线程是不能调用join()方法。

在这里插入图片描述
在这里插入图片描述
注意: 如果在交互式模式下运行该实例,则还是会有输出。因为,在交互式模式的主线程只有在退出Python时才终止。

当一个进程拥有了多个线程之后,如果它们各做各的任务没有关系还行,可是既然同属于一个进程,它们之间总是具有一定关系的。比如多个线程都要对某个数据进行修改,则可能会出现不可预料的结果。为了保证操作正确,就要对多个线程进行同步。再如,多个线程之间还会需要进行通信。现在就来了解线程的同步和通信。

Python中可以使用threading模块中的对象Lock和RLock(可重入锁)进行简单的线程同步。对于同一时刻只允许一个线程操作的数据对象,可以把操作过程放在Lock和RLock的acquire方法和release方法之间。RLock可以在同一调用链中多次请求而不会锁死,Lock则会锁死。基本使用方法如下:

在这里插入图片描述

注意: 这一对方法若前一个调用n次,后一个也要调用n次,锁才能真正地释放。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.2 进程

Python虽然支持多线程应用程序的创建,但是Python解释器使用了内部的全局解释器锁定(GIL),在任意指定的时刻只允许单个线程执行,并限制了Python程序只能在一个处理器上运行。而现代CPU已经以多核为主,但Python的多线程程序无法使用。使用Python的多进程模块可以将工作分派给不受锁定限制的单独子进程。

Python3对多进程支持的是multiprocessing模块和subprocess模块。使用multiprocessing模块创建和使用多进程,基本上和threading模块的使用方法是一致的。创建进程使用multiprocessing.Process对象来完成,和threading.Thread一样,可以用它以进程方式运行函数,也可以通过继承它来并重载run()方法来创建进程。multiprocessing模块同样具有threading模块中用于同步的Lock、RLock及用于通信的Event,本章不再赘述。

15.2.1 进程基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意: 子进程中运行的程序应该在搜索路径中,否则会找不到运行的程序而引发异常。

15.2.2 用Popen类创建进程

上节中所述的几个函数,其本质上都是通过Popen类来实现的简单版本的进程创建函数。直接使用Popen类不仅可以以新进程方式运行命令,还可以对其输入流和输出流等进行更多控制。

在这里插入图片描述
在这里插入图片描述

【代码说明】程序中首先用Popen产生一个子进程,用来执行保存在protest8.py中的python源代码(该源代码要求用户输入一串字符并直接输出和输出另一串写定的字符,以及打印一个未定义的变量a),然后调用Popen对象的communicate()方法向子进程中传入要输入的字符串,输出子进程的pid,最后分别输出子进程的标准输出和错误信息。

【运行效果】如图15.7所示,子进程的PID为4788(呵呵,是我朋友的手机尾号呢!),在输出(STDOUT)中输出了通过communicate()方法向子进程传送的输入These strings are from stdin.,而错误信息中输出了子进程的运行错误提示:NameError。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

15.3 小结

本章主要介绍了线程和进程的基本知识、Python标准库中的线程和进程相关模块的基本使用。通过学习本章,你应重点掌握Python标准库中threading模块和subprocess模块,并能使用它们来创建多线程或多进程的Python程序,但也要注意,由于受到Python语言的全局锁的影响,其多线程只是建立在单CPU的基础上运行,并不能充分使用现代计算机中系统中的多CPU,这也是Python的多线程的局限性所在。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA服务端实现页面截屏(附代码)

JAVA服务端实现页面截屏适配需求方案一、使用JxBrowser使用步骤:方案二、JavaFX WebView使用步骤:方案三、Headless Chrome使用步骤:综上方案对比记录我的一个失败方案参考适配需求 有正确完整的地址url;通过浏览器能打开该url对…

Redis缓存一致性问题(缓存更新策略)

Redis缓存的一致性1. 缓存1.1 缓存的作用:1.2 缓存的成本:2. 缓存模型3. 缓存一致性问题3.1 引入3.2 解决(1) 先更新数据库,再手动删除缓存(2) 使用事务保证原子性(3) 以Redis中的TTL为兜底3.3 案例:商铺信息查询和更新(1) 查询商…

5.12 BGP选路原则综合实验

配置BGP的选路原则 1. 实验目的 熟悉BGP的选路的应用场景掌握BGP的选路的配置方法2. 实验拓扑 实验拓扑如图5-11所示: 图5-11:配置BGP的选路原则 3. 实验步骤 (1)配置IP地址 R1的配置

Spring中自定义Session管理,Spring Session源码解析

系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 目录 系列文章:Spring Boot学习大纲,可以留言自己想了解的技术点 1、session是什么? 1>session在哪里? 2>服务器怎么知道每次说话的是…

Python + Selenium,分分钟搭建 Web 自动化测试框架!

在程序员的世界中,一切重复性的工作,都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短,迭代速度越来越快,只会点点点,不懂开发的手工测试,已经无法满足如今的…

【Datawhale图机器学习】DeepWalk和Node2Vec

DeepWalk:用于图节点嵌入的在线机器学习算法 论文介绍 DeepWalk是基于随机游走的图节点嵌入算法。首次将深度学习和自然语言处理思想用于图机器学习,将随机游走序列与句子类比,节点与单词类比,构建Word2Vec的Skip-Gram无监督&am…

了解Axios及其运用方式

Axios简介 axios框架全称(ajax – I/O – system): 基于promise用于浏览器和node.js的http客户端,因此可以使用Promise API 一、axios是干啥的 说到axios我们就不得不说下Ajax。在旧浏览器页面在向服务器请求数据时,…

计算机网络基础知识

目录 通信基础 前言 广播域与冲突域 计算机之间的连接方式 网线直连(交叉线) 同轴电缆 集线器 网桥 前言 举例(计算机6向计算机7相互通信) 交换机 交换机原理 路由器 路由器与其他设备区别: 注意&#…

Docker之路(3.docker底层原理、和虚拟机VM对比区别)

1.docker run 流程图 2. docker 底层原理 2.1 docker 是怎么工作的? Docker 是一个 Client-Server 结构的系统,Docker的守护进程运行在主机上, 通过Socket从客户端访问! DockerServer接收到Docker-Client的指令,就会执…

【历史上的今天】2 月 22 日:Red Hat Enterprise Linux 问世;BASIC 语言作者出生;计算机协会创始人诞生

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 2 月 22 日,在 1857 年的今天,德国物理学家海因里希赫兹(Heinrich Hertz)出生。赫兹于 1887 年首先用实验证实了…

Mysql数据备份

一.数据备份的意义(1)保护数据的安全;(2)在出现意外的时候(硬盘的损坏,断电,黑客的攻击),以便数据的恢复;(3)导出生产的数…

【音频处理和分析工具】上海道宁与NUGEN Audio助力您更轻松地提供高质量、合规的音频

NUGEN Audio的产品 可在任何情况下提供 先进的保真度和 不受限制的创造力 提供直接和直观的声音处理方式 NUGEN工具可以更轻松地 提供高质量、合规的音频 同时节省时间 降低成本并保留创作过程 开发商介绍 NUGEN Audio是后期制作、音乐和广播领域的知名品牌&#xff0c…

【Mysql】 锁

【Mysql】 锁 文章目录【Mysql】 锁1. 锁1.1 概述1.2 全局锁1.2.1 介绍1.2.2 语法1.2.2.1 加全局锁1.2.2.2 数据备份1.2.2.3 释放锁1.2.3 特点1.3 表级锁1.3.1 介绍1.3.2 表锁1.3.3 元数据锁1.3.4 意向锁1.4 行级锁1.4.1 介绍1.4.2 行锁1.4.3 间隙锁&临键锁1. 锁 1.1 概述…

一起学习用Verilog在FPGA上实现CNN----(八)integrationFC设计

1 integrationFC设计 LeNet-5网络结构全连接部分如图所示,该部分有2个全连接层,1个TanH激活层,1个SoftMax激活层: 图片来自附带的技术文档《Hardware Documentation》 integrationFC部分原理图,如图所示,…

python基于flask共享单车系统vue

可定制框架:ssm/Springboot/vue/python/PHP/小程序/安卓均可开发 目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2. 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可行性 6 3.1.3运行可行…

应用层协议

目录 应用层常见协议 DNS协议 前言 域名结构 DNS服务器分类 DNS的工作原理 DNS工作原理实例 DNS记录 DHCP协议 静态IP与动态IP DHCP协议好处 DHCP分配IP地址的4阶段 电子邮件 邮件的过程 电子邮件发送过程 pop协议特点 IMAP协议的特点 FTP协议 前言 FTP数据…

操作系统-初次理解

目录 1. 冯诺依曼体系 2. 操作系统 2.1 概念 2.2 解释 2.3 为什么管理 1. 冯诺依曼体系 我相信大家在学习计算机语言时一定听过这个体系结构的,那么这个结构到底是什么呢?上图: 该图是我对冯诺依曼体系结构简单构造,真实情况更…

Java实现多线程有几种方式(满分回答)

目录JDK8 创建的线程的两种方式orcle文档解释方式一:继承Thread类方式二:实现Runnable接口同时用两种的情况其他间接创建方式Callable接口线程池JDK8 创建的线程的两种方式 orcle文档解释 orcle文档:https://docs.oracle.com/javase/8/docs…

【项目精选】动漫论坛的设计与实现(论文+视频+源码)

点击下载源码 作为文化产业的一部分,动漫影响了我国一代又一代青少年,据钱江晚报调查显示,有超过七成的95后愿意从事与动漫相关的行业,可见其对青少年影响力之大。 动漫论坛作为最先开始热爱动漫人士进行交流的方式之一&#xff0…

让师生“不跑腿”,教育数据治理究竟有何魔力

当前,教育信息化新基础设施正在加紧建设,教育业务系统应用不断推进,各种软硬件平台源源不断地产生着教育数据。海量数据的汇聚和分析,能给教育系统带来什么?如何在教育数字化转型中,探索出基于数据驱动的新…