python从入门到精通(十九):python的多线程详细使用

python的多线程详细使用

  • 1.什么是线程
  • 2.线程的作用
  • 3.导入线程
    • 4.创建线程
      • 启动线程
      • 线程阻塞
      • 线程的方法
    • 守护线程
    • 线程阻塞
      • 2个都是守护线程
      • 1个是守护线程
    • 线程间通信

1.什么是线程

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

2.线程的作用

Python中的程序默认是只有一个主线程的,也就是说,执行程序的时候,你写的代码都是串行执行的,CPU利用率可能并没有得到很好的利用,还有很多的空闲,而这个时候利用多线程,多线程是指同时使用多个线程执行代码,以实现并发执行任务的目的,CPU利用率将会大大提升,程序速度也就能大大增快

3.导入线程

多线程开发推荐使用 threading 模块

from threading import Thread

4.创建线程

调用threading.Thread类

threading.Thread(target=None, name=None, args=(), kwargs={})
# target 指要创建的线程的方法名,name 指给此线程命名,命名后可以调用 threading.current_thread().name 方法输出该线程的名字
# args/kwargs 指 target 指向的方法需要传递的参数,必须是元组形式,如果只有一个参数,需要以添加逗号

实例化线程

# method 为线程要执行的具体方法
thread01 = Thread(target=method)  #method要使用线程的函数名称

实现两条线程

thread02 = Thread(target=method)

实现多个线程依次类推

启动线程

thread01.start()
thread01.start()

线程阻塞

等待所有线程执行完成再进行下一步操作

thread01.join()
thread02.join()
# 等待线程执行完成

线程的方法

方法描述
threading.current_thread()返回当前线程的信息
threading.enumerate()返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程
threading.active_count()返回正在运行的线程数量,与len(threading.enumerate())有相同的结果
import time
import threading
from threading import Thread
def task():num = 0for i in range(100):num *= iresult.append(num)thread01 = Thread(target=task)
thread02 = Thread(target=task)
if __name__ == "__main__":thread01.start()thread02.start()print("正在运行的线程数量", threading.active_count())print("将当前所有线程的具体信息展示出来", threading.enumerate())print("返回当前线程的信息", threading.current_thread())
 2
将当前所有线程的具体信息展示出来 [<_MainThread(MainThread, started 12752)>]
返回当前线程的信息 <_MainThread(MainThread, started 12752)>

守护线程

Python在进程启动起来后,会自动创建一个主线程,主线程默认会等待所有线程执行完成之后再退出,但是如果我们设置了守护线程,主线程任务一旦完成,所有子线程将会和主线程一起结束,即使子线程没有执行完也会退出。

方法一:设置守护线程是创建子线程对象时,以daemon参数的形式指定

thread01 = Thread(target=task,name="t1",daemon=True)

方法二:通过setDaemon(True)的形式进行设置

thread01.setDaemon(True)
在这里插入代码片

线程阻塞

假如说我们不希望主线程完成直接退出而不等待其他线程的话,我们可以为主线程设置阻塞,并设计好阻塞时间,以等待其他线程执行完毕。用join()方法使主线程陷入阻塞,是实现线程同步的一种方式。参数timeout可以用来设置主线程陷入阻塞的时间,

2个都是守护线程

def task(num):print('线程名称:', threading.current_thread().name, '参数:', num, '开始时间:',time.strftime('%Y-%m-%d %H:%M:%S'))thread01 = Thread(target=task, name="t1", daemon=True, args=(6,))
thread02 = Thread(target=task, name="t2", daemon=True, args=(10,))
if __name__ == "__main__":print('主线程开始时间:', time.strftime('%Y-%m-%d %H:%M:%S'))thread01.start()thread02.start()thread01.join(timeout=3)  # 主线程等待3秒 等待线程1执行完thread02.join(timeout=3)  # 主线程阻塞3秒 等待线程2执行完 共阻塞6秒 全部执行完毕print("正在运行的线程数量", threading.active_count())print("将当前所有线程的具体信息展示出来", threading.enumerate())print("返回当前线程的信息", threading.current_thread())

1个是守护线程

一个子线程设为非守护线程,另一个子线程设为守护线程,主线程等待3秒后结束,看看输出的情况。

def task(num):for i in range(num):print('线程名称:', threading.current_thread().name, '参数:', num, '开始时间:',time.strftime('%Y-%m-%d %H:%M:%S'))time.sleep(2)thread01 = Thread(target=task, name="t1",daemon=True, args=(1,))thread02 = Thread(target=task, name="t2",args=(100,))
if __name__ == "__main__":print('主线程开始时间:', time.strftime('%Y-%m-%d %H:%M:%S'))thread01.start()thread02.start()# 主线程等待3秒time.sleep(3)print('{} Runing'.format(threading.current_thread().name))print("正在运行的线程数量", threading.active_count())print("将当前所有线程的具体信息展示出来", threading.enumerate())print("返回当前线程的信息", threading.current_thread())
主线程开始时间: 2024-02-12 16:07:05
线程名称: t1 参数: 1 开始时间: 2024-02-12 16:07:05
线程名称: t2 参数: 100 开始时间: 2024-02-12 16:07:05
线程名称: t2 参数: 100 开始时间: 2024-02-12 16:07:07
MainThread Runing
正在运行的线程数量 2
将当前所有线程的具体信息展示出来 [<_MainThread(MainThread, started 9624)>, <Thread(t2, started 7112)>]
返回当前线程的信息 <_MainThread(MainThread, started 9624)>
线程名称: t2 参数: 100 开始时间: 2024-02-12 16:07:09
线程名称: t2 参数: 100 开始时间: 2024-02-12 16:07:11
线程名称: t2 参数: 100 开始时间: 2024-02-12 16:07:13

守护进程已经执行完了,但是非守护进程还在执行,程序也就还在执行,一旦非守护进程结束,会随主线程全部结束。

线程间通信

线程之间共享同一块内存。子线程虽然可以通过指定target来执行一个函数,但是这个函数的返回值是没有办法直接传回主线程的。我们使用多线程一般是用于并行执行一些其他任务,因此获取子线程的执行结果十分有必要。

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

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

相关文章

数字图像处理实验记录十(图像分割实验)

一、基础知识 1、什么是图像分割 图像分割就是指把图像分成各具特性的区域并提取出感兴趣目标的技术和过程&#xff0c;特性可以是灰度、颜色、纹理等&#xff0c;目标可以对应单个区域&#xff0c;也可以对应多个区域。 2、图像分割是怎么实现的 图像分割算法基于像素值的不连…

「Java」static 关键字

介绍 概述&#xff1a;static 是一个静态关键字使用 修饰一个成员变量&#xff1a;static 数据类型 变量名 修饰一个方法 修饰符 static 返回值类型 方法名(形参){方法体 return 结果 }调用静态成员&#xff1a;类名直接调用&#xff08;不用 new 对象&#xff09; static…

ubuntu下如何查看显卡及显卡驱动

ubuntu下如何查看显卡及显卡驱动 使用nvidia-smi 工具查看 查看显卡型号nvida-smi -L $ nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3050 4GB Laptop GPU (UUID: GPU-4cf7b7cb-f103-bf56-2d59-304f8996e28c)当然直接使用nvida-smi 命令可以查看更多信息 $ nvidia-smi Mon Fe…

C# CAD2016获取数据操作BlockTableRecord、Polyline、DBObject

一、数据操作说明 //DBObject 基础类 DBObject dbObj (DBObject)tr.GetObject(outerId, OpenMode.ForRead); //Polyline 线段类 Polyline outerPolyline (Polyline)tr.GetObject(outerId, OpenMode.ForRead); //BlockTableRecord 块表类 BlockTableRecord modelSpace (Bloc…

vue_dev_tools工具下载安装打包

vue_dev_tools工具下载安装打包 一、简介二、安装方式2.1.安装图文2.2.打包工具 endl 一、简介 使用 Vue 时&#xff0c;在浏览器上安装 Vue Devtools Vue Devtools 是 Vue 官方发布的调试浏览器插件&#xff0c;可以安装在 Chrome 和 Firefox 等浏览器上&#xff0c;直接内嵌…

LeetCode Python - 12. 整数转罗马数字

目录 题目答案运行结果 题目 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的 1。1…

去空行小工具Html + Javascript

这是一个平常用到的小工具&#xff0c;为了节省屏幕空间把空行去掉&#xff0c;怕要用的时候找不到故记录在此。 效果图 网页版&#xff0c;放在浏览器里就可以用 <!doctype html> <html><head><meta charset"utf-8"><title>去回车…

学习数据结构和算法的第8天

顺序表的实现 顺序表 ​ 本质就是数组 概念及结构 ​ 顺序表是用一段物理地址连续的储存单元依次储存数据元素的线性结构&#xff0c;一般情况下采用数组储存&#xff0c;在数组上完成数据的增删。 顺序表就是数组&#xff0c;但是在数组的基础上&#xff0c;它还要求数据…

网络安全的今年:量子、生成人工智能以及 LLM 和密码

尽管世界总是难以预测&#xff0c;但网络安全的几个强劲趋势表明未来几个月的发展充满希望和令人担忧。有一点是肯定的&#xff1a;2024 年将是非常重要且有趣的一年。 近年来&#xff0c;人工智能&#xff08;AI&#xff09;以令人难以置信的速度发展&#xff0c;其在网络安全…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中&#xff0c;安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时&#xff0c;保护用户信息的安全性是非常重要…

计算机硬件 7.1操作系统与驱动程序

第七章 软件系统 第一节 操作系统 驱动程序 一、操作系统 1.常见操作系统&#xff1a;Windows、mac os、Linux、Unix。 2.操作系统五大功能&#xff1a;处理器管理、存储器管理、设备管理、文件管理和作业管理。 3.安装过程&#xff1a; ①用存放操作系统的设备启动计算机&…

【算法题】102. 二叉树的层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a;…

中科大计网学习记录笔记(八):FTP | EMail

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

MySQL性能调优篇(3)-缓存的优化与清理

MySQL数据库缓存的优化与清理 数据库缓存在MySQL中扮演着非常重要的角色&#xff0c;它可以显著提高数据库的性能和响应速度。在本篇博客中&#xff0c;我们将介绍如何优化和清理MySQL数据库的缓存&#xff0c;以进一步提高数据库的效率。 优化缓存 1. 适当调整缓存大小 My…

基于STM32与FreeRTOS的四轴机械臂项目

目录 一、项目介绍 二、前期准备 1.硬件准备 2.开发环境 3.CubeMX配置 三、裸机各种模块测试 1.舵机模块 2.蓝牙模块 3.按键摇杆传感器模块和旋钮电位器模块 4.OLED模块 5.W25Q128模块 四、裸机三种控制测试 1.摇杆控制 2.示教器控制 3.蓝牙控制 五、裸机与Free…

LabVIEW智能温度监控系统

LabVIEW智能温度监控系统 介绍了一个基于LabVIEW的智能温度监控系统&#xff0c;实现对工业环境中温度的实时监控与调控。通过集成传感器技术和LabVIEW软件平台&#xff0c;系统能够自动检测环境温度&#xff0c;及时响应温度变化&#xff0c;并通过图形用户界面(GUI)为用户提…

【头歌·计组·自己动手画CPU】二、运算器设计(讲解版) 【计算机硬件系统设计】

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

FTP服务简介(工作原理、连接模式、流行服务器软件)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输服务&#xff09;提供在Internet上的任意两台计算机之间相互进行的文件传输。只要双方主机都支持FTP协议&#xff0c;就可以利用FTP来进行文件传输。 工作原理 FTP服务是客户/服务器模式&#xff0c;用户通过客户机…

什么是智慧隧道,如何建设智慧隧道

一、隧道管理的难点痛点 近年来隧道建设规模不断扩大&#xff0c;作为隧道通车里程最多、规模最大的国家&#xff0c;截至2022年底&#xff0c;我国公路隧道共有24850处、2678.43万延米&#xff0c;其中特长隧道1752处、795.11万延米&#xff0c;长隧道6715处、1172.82万延米。…

蓝桥杯每日一题----素数筛

素数筛 素数筛的作用是筛选出[2,N]范围内的所有素数&#xff0c;本次主要讲解两种方法&#xff0c;分别是埃氏筛和欧拉筛。证明时会提到唯一分解定理&#xff0c;如果不知道的小伙伴可以先去学一学&#xff0c;那我们开始啦&#xff01; 1.埃氏筛 主要思想&#xff1a;当找到…