学python的第二十天

多线程

以下内容来源于《看漫画学Python》这本书,前面十几天好多内容参考过本书内容,写的挺好。

1 线程相关知识

1.1 进程

        一个进程就是一个正在执行的程序,每一个进程都有自己独立的一块内存空间,一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的

        在Windows操作系统中,一个进程就是一个exe或者dll程序,它们相互独立,相互也可以通信。

1.2 线程

        在一个进程中可以包含多个线程,多个线程共享一块内存空间和一组系统资源。所以,系统在各个线程之间切换时,开销要比进程小得多,线程被称为轻量级进程。

1.3 主线程

        Python程序至少有一个线程,这就是主线程,程序在启动后由Python解释器负责创建主线程,在程序结束后由Python解释器负责停止主线程。

        在多线程中,主线程负责其他线程的启动,挂起,停止等操作。其他线程被称为子线程。

2 线程模块-----------threading

         Python官方提供的threading模块可以进行多线程编程。threading模块提供了多线程编程的高级API,使用起来比较简单。

         在threading模块中提供了线程类Thread,还提供了很多线程相关的函数,常用如下:

active_count():返回当前处于活动状态的线程个数

current_thread():返回当前的Thread对象

main_thread():返回主线程对象。

主线程是Python解释器启动的线程。示例代码如下:

import threading  # 导入threading模块t = threading.current_thread()  # 获取当前线程对象
print(t.name)  # 输出当前线程的名字
print(threading.active_count())  # 输出当前活动线程的个数t = threading.main_thread()
print(t.name)  # 输出主线程的名字

输出结果:当前线程和主线程是同一个 

 3 创建子线程

创建一个可执行的子线程需要:线程对象线程体

线程对象:线程对象是threading模块的线程类Thread或Thread子类所创建的对象。

线程体:线程体是子线程要执行的代码,这些代码会被封装到一个函数中。子线程在启动后会执行线程体。

实现线程体主要有以下两种方式:

1,自定义函数实现线程体

2,自定义线程类实现线程体

3.1 自定义函数实现线程体

创建线程Thread对象的构造方法如下:

Thread(target=None, name=None, args=())

target参数指向线程体函数,可以自定义该线程体的函数;通过name参数可以设置线程名,若省略这个参数,则系统会为其分配一个名称;args是为线程体函数提供的参数,是一个元组类型。

示例代码如下:

import threading
import timedef thread_body():  # 定义线程体函数t = threading.current_thread()  # 获取当前线程对象for n in range(5):  # 执行5次print('第{0}次执行线程{1}'.format(n, t.name))time.sleep(2)  # 当前线程休眠两秒print('线程{0}执行完毕'.format(t.name))t1 = threading.Thread(target=thread_body)  # 创建线程对象t1
t2 = threading.Thread(target=thread_body, name='MyThready')  # 创建线程对象t2
t1.start()  # 启动线程t1
t2.start()  # 启动线程t2

输出结果:

 3.2 自定义线程类实现线程体

创建一个Thread子类并重写run()方法,run()方法就是线程体函数

示例代码如下:

import threading
import timeclass SmallThread(threading.Thread):def __init__(self, name=None):super().__init__(name=name)def run(self):  # 重写run()方法t = threading.current_thread()  # 获取当前线程对象for n in range(5):  # 执行5次print('第{0}次执行线程{1}'.format(n, t.name))time.sleep(2)  # 当前线程休眠两秒print('线程{0}执行完毕'.format(t.name))t1 = SmallThread()  # 创建线程对象t1
t2 = SmallThread(name='MyThready')  # 创建线程对象t2
t1.start()  # 启动线程t1
t2.start()  # 启动线程t2

输出结果: 

 

4 线程管理

线程管理包括: 线程创建,线程启动,线程休眠,等待线程结束,和线程停止。

前三个内容前面已涉及,以下主要是等待线程结束,线程停止的内容。

4.1 等待线程结束

       一个线程(假设是主线程)需要等待另一个线程(假设是t1子线程)执行结束后才能继续执行。

 示例代码如下:

import threading
import timevalue = []  # 定义一个共享变量,多个线程可以访问该变量def thread_body():print('t1线程开始...')for n in range(2):print('t1子线程执行...')value.append(n)time.sleep(2)print('t1子线程结束...')print('主线程开始执行...')
t1 = threading.Thread(target=thread_body)  # 创建线程对象t1
t1.start()  # 启动线程t1
t1.join()  # 等待线程t1结束
print('value = {0}'.format(value))
print('主线程继续执行...')

输出结果:

 若注释掉t1.join()语句,输出结果为:

 4.2 线程停止

        在线程结束时,线程就停止了,业务复杂时,会在线程体执行一个“死循环”。通过判断停止变量实现线程体是否持续执行“死循环”,“死循环”结束则线程体结束,线程也就结束了。

        一般情况下,死循环会执行线程任务,然后休眠,再执行,再休眠,直到循环结束。

示例代码如下:

import threading
import time# 线程停止变量
isrunning = Truedef workthread_body():  # 定义工作线程体函数while isrunning:print('工作线程正在执行...')time.sleep(5)print('工作线程结束')def controlthread_body():  # 定义控制线程体函数global isrunningwhile isrunning:command = input('请输入停止指令:')if command == 'exit':isrunning = Falseprint('控制线程结束')workthread = threading.Thread(target=workthread_body)  # 创建工作线程对象
workthread.start()  # 启动工作线程
controlthread = threading.Thread(target=controlthread_body)  # 创建控制线程对象
controlthread.start()  # 启动控制线程

输出结果如下:

 5 爬虫下载图片示例:

import threading
import time
import urllib.request# 线程停止变量
isrunning = Truedef workthread_body():  # 定义工作线程体函数while isrunning:print('工作线程正在执行...')download()  # 调用下载图片的函数time.sleep(5)print('工作线程结束')def controlthread_body():  # 定义控制线程体函数global isrunningwhile isrunning:command = input('请输入停止指令:')if command == 'exit':isrunning = Falseprint('控制线程结束')def download():    # 定义下载图片的函数url = '此处替换图片链接'   # 此处替换图片链接req = urllib.request.Request(url)  # 创建请求对象with urllib.request.urlopen(req) as response:   # 发起请求data = response.read()f_name = 'download.png'with open(f_name, 'wb') as f:  # 打开文件f.write(data)print('图片下载成功')workthread = threading.Thread(target=workthread_body)  # 创建工作线程对象
workthread.start()  # 启动工作线程
controlthread = threading.Thread(target=controlthread_body)  # 创建控制线程对象
controlthread.start()  # 启动控制线程

输出结果:

 

 

 

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

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

相关文章

3月魅力彩妆行业数据分析:某国产品牌彩妆产品销额将近30亿!

彩妆行业发展多年,经历了多重红利期和激烈的市场竞争后,进入到缓慢发展时期。 根据鲸参谋数据显示,今年3月在线上电商平台(淘宝天猫京东)彩妆产品销量累计超过6700万件,同比去年下降了29%;销售…

小程序视频如何下载到手机#下载高手

在本文中,我将向您介绍一个工具:下载高手,帮助您轻松下载小程序视频,并将其保存到您的手机中。无论是学习教育类的小程序视频,还是图片素材类的小程序,这些方法都适用于各种类型的小程序。 工具我已经打包好了&#x…

Vue集成three.js,加载glb、gltf类型的3d模型

安装基本依赖 // 注意OrbitControls要加{},注意路径是jsm import { OrbitControls } from ‘three/examples/jsm/controls/OrbitControls.js’; // import { dat } from ‘three/examples/jsm/controls/dat.gui.js’; // dat gui这个插件,是另外自己下载…

计算机网络---第十一天

生成树协议 stp作用: 作用:stp用于解决二层环路问题。 BPDU: 含义:桥协议数据单元,用于传递stp协议相关报文 分类:配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

【性能测试】ChaosTesting(混沌测试)ChaosBlade(混沌实验工具)(四)-k8s容器混沌实验

5. 创建 kubernetes 相关的实验场景 5.0 blade create k8s 5.0.1 介绍 创建 kubernetes 相关的实验场景,除了使用 blade 命令创建场景外,还可以将实验使用 yaml 文件描述,使用 kubectl 命令执行。目前支持的实验场景如下: [bl…

基于spring boot学生综合测评系统

基于spring boot学生综合测评系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件…

重磅!Llama-3,最强开源大模型正式发布!

4月19日,全球科技、社交巨头Meta在官网,正式发布了开源大模型——Llama-3。 据悉,Llama-3共有80亿、700亿两种参数,分为基础预训练和指令微调两种模型(还有一个超4000亿参数正在训练中)。 与Llama-2相比&…

如何阻止cPanel与WHM自动重定向到服务器主机名

本周有一个客户,购买Hostease的VPS主机,询问我们的在线客服,如何阻止cPanel / WHM自动重定向到服务器主机名。我们为用户提供教程,用户很快完成了设置。在此,我们分享这个操作教程,希望可以对您有帮助。 接…

Python自学篇2-导入Win32库

Python导入win32模块 导入win32模块可以让我们在Python中使用Windows的API功能,这对于开发需要与Windows操作系统进行交互的应用程序非常有用。 本文将介绍如何导入win32模块,并提供一些代码示例来帮助读者更好地理解。 什么是win32模块? …

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.3-13.5

目录 第 8 周 13、 聚类(Clustering)13.3 优化目标13.4 随机初始化13.5 选择聚类数 第 8 周 13、 聚类(Clustering) 13.3 优化目标 K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又…

【1646】医院人员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 医院人员管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

【vue2】实现微信截图(复制图片)在项目内可粘贴

需求 后台管理在上传图片地方需要将复制的图片粘贴上传 一、添加事件 在原有上传组件的基础上添加 paste事件 二、方法 onPaste(e) {const items (e.clipboardData || window.clipboardData).items;let blob null;for (let i 0; i < items.length; i) {if (items[i].ty…

PS入门|用PS设计物品尺寸,需要注意的几个重要问题

注&#xff1a;仅学习使用 【PS24】2024版本更新的内容比较多&#xff0c;对电脑配置的要求也是比较高的。建议配置&#xff1a;第十代i5或以上CPU。 如果是第十代i3或以下的CPU&#xff0c;建议安装PS2021或者以下版本。 ---这是一条不正经的分割线--- 讲了那么久的PS教程…

Matlab 对nc文件进行处理

1.介绍nc文件 NetCDF全称为network Common Data Format&#xff0c;中文译法为“网络通用数据格式”&#xff1b;netcdf文件开始的目的是用于存储气象科学中的数据&#xff0c;现在已经成为许多数据采集软件的生成文件的格式。 •从数学上来说&#xff0c;netcdf存储的数据就是…

springboot停机关闭前保证处理完请求

application.yml配置 server:shutdown: graceful // 处理完请求在关闭服务server:shutdown: immediate // 立刻关闭&#xff0c;默认 jvm关闭自带的回调

fakak详解(2)

Kafka和Flume整合 Kafka与flume整合流程 Kafka整合flume流程图 flume主要是做日志数据(离线或实时)地采集。 图-21 数据处理 图-21显示的是flume采集完毕数据之后&#xff0c;进行的离线处理和实时处理两条业务线&#xff0c;现在再来学习flume和kafka的整合处理。 配置fl…

Python基础学习之去除换行符

strip() 方法 strip() 方法用于去除字符串开头和结尾的空白字符&#xff0c;包括换行符&#xff08;\n&#xff09;、制表符&#xff08;\t&#xff09;和空格等。如果您想从字符串数据中去掉换行符&#xff0c;无论是单独存在的还是与其他空白字符一起&#xff0c;strip() 方…

【LAMMPS学习】八、基础知识(4.3)TIP3P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

李沐57_长短期记忆网络LSTM——自学笔记

LSTM 1.忘记门&#xff1a;将值朝着0减少 2.输入门&#xff1a;决定不是忽略掉输入数据 3.输出门&#xff1a;决定是不是使用隐状态 !pip install --upgrade d2l0.17.5 #d2l需要更新首先加载时光机器数据集。 import torch from torch import nn from d2l import torch a…

「React Native」为什么要选择 React Native 作为的跨端方案

文章目录 前言一、常见因素二、举个栗子2.1 项目背景2.2 为什么选择 React Native2.3 项目实施2.4 成果总结 前言 没有完美的跨端技术&#xff0c;只有适合的场景。脱离适用场景去谈跨端技术没有什么意义。 一、常见因素 共享代码库&#xff1a; React Native 允许开发者编写…