Python 线程创建和传参 - Python零基础入门教程
目录
- 一.Python 线程解释
- 二.Python 线程创建和启动
- 1.导入线程模块
- 2.创建线程并初始化线程
- 3.启动线程
- 三.Python 线程传参
- 四.Python 线程结束
- 五.Python 线程相关函数介绍
- 六.Python 线程重点总结
- 七.猜你喜欢
零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门
在以前的文章中虽然我们没有介绍过线程这个概念,但是实际上前面所有代码都是线程,只不过是单线程,代码由上而下依次执行或者进入 main 函数执行,这样的单线程也称为主线程。
有了单线程的话,什么又是多线程?可以这么理解:一个线程执行一个代码块,多个线程可以同时执行多个代码,使用多线程能让程序效率更高。举个例子,你今天有两件事需要完成,分别是洗衣服和打扫房间,分别来看看单线程和多线程如何完成:
单线程:先用洗衣机洗衣服30分钟,等衣服洗完之后再打扫房间60分钟,累计总耗时:90分钟;多线程:把衣服放到洗衣机并且30分钟后自动结束,然后立刻开始打扫房间60分钟,累计耗时:60分钟;
由此可见,完成同样的事情,单线程是一件事情做完之后继续下一件事情,而多线程可以同时执行多件事情,所以多线程比单线程效率更高!
一.Python 线程解释
线程是 cpu 最小调度单位,一个程序中至少有一个或者多个线程(至于进程暂时不做讲解,后面文章会有详细解释)!在开发中使用线程可以让程序运行效率更高,多线程类似于同时执行多个不同代码块。
二.Python 线程创建和启动
1.导入线程模块
# 导入线程threading模块
import threading
2.创建线程并初始化线程
调用 threading 模块中的缺省函数 Thread ,创建并初始化线程,返回线程句柄。如果对缺省函数已经忘记的小伙伴请回到 Python 函数的声明和定义中关于缺省参数部分复习一下。
# 创建并初始化线程,返回线程句柄
t = threading.Thread(target=函数名)
3.启动线程
通过初始化返回的线程句柄调用 start 函数,启动线程,此时会自动执行在创建线程时 target 对应的函数内部的代码:
# 启动线程
t.start()
综合上面三步,下面使用代码对 Python 线程 thread 做详细讲解:
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程创建和传参.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入线程threading模块
import threading
# 导入内置模块time
import timedef wash_clothes():print("洗衣服开始...")# sleep 5 秒,默认以秒为单位time.sleep(5)print("洗衣服完成...")def clean_room():print("打扫房间开始...")# sleep 5 秒,默认以秒为单位time.sleep(5)print("打扫房间完成...")if __name__ == "__main__":# 创建线程并初始化 -- 该线程执行wash_clothes中的代码t1 = threading.Thread(target=wash_clothes)# 创建线程并初始化 -- 该线程执行clean_room中的代码t2 = threading.Thread(target=clean_room)t1.start()t2.start()'''
输出结果:洗衣服开始...
打扫房间开始...
洗衣服完成...
打扫房间完成...
'''
运行程序可以发现程序从运行开始到结束,一共耗时 5 秒时间!注意观察输出日志:
- 第一步:洗衣服开始和打扫房间开始几乎同时开始,两个事件同时执行.
- 第二步:程序停止 5 秒;
- 第三步:洗衣服和打扫房间几乎同时完成
当然你也可以按照以前的学习的内容,先调用 wash_clothes 函数,在调用 clean_room 函数,同样能输出内容,而耗时却是 10 秒左右,示例代码如下:
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程创建和传参.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入内置模块time
import timedef wash_clothes():print("洗衣服开始...")# sleep 5 秒,默认以秒为单位time.sleep(5)print("洗衣服完成...")def clean_room():print("打扫房间开始...")# sleep 5 秒,默认以秒为单位time.sleep(5)print("打扫房间完成...")if __name__ == "__main__":wash_clothes()clean_room()'''
输出结果:洗衣服开始...
洗衣服完成...
打扫房间开始...
打扫房间完成...'''
运行程序可以发现程序从运行开始到结束,一共耗时 10 秒时间!注意观察输出日志:
- 第一步:洗衣服开始;
- 第二步:程序停止了 5 秒;
- 第三步:洗衣服完成,打扫房间开始
- 第四步:程序停止 5 秒;
- 第五步:打扫房间结束,程序结束;
由此可见:多线程可以同时运行多个任务,效率远比单线程更高!
三.Python 线程传参
在上面的例子中,我们并没有为线程传递参数,如果在线程中需要传递参数怎么办呢?
threading.Thread 函数中有两个缺省参数 args 和 kwargs ,args 是元组类型,kwargs 是字典类型,缺省值默认为空,除此之外,其实还可以设置线程的名字等,其函数声明如下:
(ps:如果对缺省函数已经忘记的小伙伴请回到 Python 函数的声明和定义中关于缺省参数部分复习一下)
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程创建和传参.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""def __init__(self, group=None, target=None, name=None,args=(), kwargs=None, *, daemon=None):"""This constructor should always be called with keyword arguments. Arguments are:*group* should be None; reserved for future extension when a ThreadGroupclass is implemented.*target* is the callable object to be invoked by the run()method. Defaults to None, meaning nothing is called.*name* is the thread name. By default, a unique name is constructed ofthe form "Thread-N" where N is a small decimal number.*args* is the argument tuple for the target invocation. Defaults to ().*kwargs* is a dictionary of keyword arguments for the targetinvocation. Defaults to {}.If a subclass overrides the constructor, it must make sure to invokethe base class constructor (Thread.__init__()) before doing anythingelse to the thread."""
示例代码如下:
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程创建和传参.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入线程threading模块
import threading
# 导入内置模块time
import timedef wash_clothes(*args,**kargcs):print("wash_clothes:",args)print("wash_clothes:", kargcs)def clean_room(*args,**kargcs):print("clean_room:",args)print("clean_room:", kargcs)if __name__ == "__main__":# args 传递元组,可以同时传递多个数据# kwargs 传递字典,可以同时传递多个键值对t1 = threading.Thread(target=wash_clothes,args=(1,"猿说python"),kwargs={"a":1,"b":False}) # args 传递元组,可以同时传递多个数据# kwargs 传递字典,可以同时传递多个键值对t2 = threading.Thread(target=clean_room,args=(2,False),kwargs={"c":0.2,"d":False})t1.start()t2.start()
四.Python 线程结束
值得思考的是:在上面这份代码中一共有几个线程呢?并非两个,一共是三个线程:
- 线程一:__name__ == “__main__” 作为主线程;
- 线程二:t1 作为子线程;
- 线程三:t2 作为子线程;
注意:主程序会等待所有子程序结束之后才会结束!
五.Python 线程相关函数介绍
- 1.threading.Thread — 创建线程并初始化线程,可以为线程传递参数 ;
- 2.threading.enumerate — 返回一个包含正在运行的线程的 list;
- 3.threading.activeCount — 返回正在运行的线程数量,与 len(threading.enumerate)有相同的结果;
- 4.Thread.start — 启动线程 ;
- 5.Thread.join — 阻塞函数,一直等到线程结束为止 ;
- 6.Thread.isAlive — 返回线程是否活动的;
- 7.Thread.getName — 返回线程名;
- 8.Thread.setName — 设置线程名;
- 9.Thread.setDaemon — 设置为后台线程,这里默认是 False,设置为 True 之后则主线程不会再等待子线程结束才结束,而是主线程结束意味程序退出,子线程也立即结束,注意调用时必须设置在 start 之前;
简单的示例代码:
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程创建和传参.py
@Time:2021/04/24 08:00
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""# 导入线程threading模块
import threading
# 导入内置模块time
import timedef wash_clothes(*args,**kargcs):time.sleep(2)print("wash_clothes:",args)time.sleep(2)print("wash_clothes:", kargcs)def clean_room(*args,**kargcs):time.sleep(2)print("clean_room:",args)time.sleep(2)print("clean_room:", kargcs)if __name__ == "__main__":# args 传递元组,可以同时传递多个数据# kwargs 传递字典,可以同时传递多个键值对t1 = threading.Thread(target=wash_clothes,args=(1,"猿说python"),kwargs={"a":1,"b":False})t2 = threading.Thread(target=clean_room,args=(2,False),kwargs={"c":0.2,"d":False})# setDaemon(True)意味着主线程退出,不管子线程执行到哪一步,子线程自动结束# t1.setDaemon(True)# t2.setDaemon(True)t1.start()t2.start()print("threading.enumerate():",threading.enumerate())print("threading.activeCount():", threading.activeCount())print("t1.isAlive():",t1.isAlive())print("t1.getName():", t1.getName())print("t2.isAlive():", t2.isAlive())t2.setName("my_custom_thread_2")print("t2.getName():", t2.getName())'''
输出结果:threading.enumerate(): [<_MainThread(MainThread, started 18388)>, <Thread(Thread-1, started 16740)>, <Thread(Thread-2, started 17888)>]
threading.activeCount(): 3
t1.isAlive(): True
t1.getName(): Thread-1
t2.isAlive(): True
t2.getName(): my_custom_thread_2
clean_room: (2, False)
wash_clothes: (1, '猿说python')
wash_clothes: {'a': 1, 'b': False}
clean_room: {'c': 0.2, 'd': False}'''
六.Python 线程重点总结
1.默认主线程会等待所有子线程结束之后才会结束,主线程结束意味着程序退出;如果 setDaemon 设置为 True ,主线程则不会等待子线程,主线程结束,子线程自动结束;
2.threading 模块除了以上常用函数,还有互斥锁 Lock / 事件 Event / 信号量 Condition / 队列 Queue 等,由于篇幅有限,后面文章再一一讲解!!
七.猜你喜欢
- Python for 循环
- Python 字符串
- Python 列表 list
- Python 元组 tuple
- Python 字典 dict
- Python 条件推导式
- Python 列表推导式
- Python 字典推导式
- Python 函数声明和调用
- Python 不定长参数 *argc/**kargcs
- Python 匿名函数 lambda
- Python return 逻辑判断表达式
- Python 字符串/列表/元组/字典之间的相互转换
- Python 局部变量和全局变量
- Python type 函数和 isinstance 函数区别
- Python is 和 == 区别
- Python 可变数据类型和不可变数据类型
- Python 浅拷贝和深拷贝
未经允许不得转载:猿说编程 » Python 线程创建和传参
Python 线程创建和传参 - Python零基础入门教程相关推荐
- Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...
- Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...
- Python 线程优先队列 PriorityQueue - Python零基础入门教程
目录 一.Python 线程队列 Queue 分类 二.Python 线程优先队列 PriorityQueue 简介 三.Python 线程优先队列 PriorityQueue 函数介绍 四.Pyth ...
- Python 线程队列 LifoQueue – LIFO - Python零基础入门教程
目录 一.Python 线程队列 Queue 分类 二.Python 线程先进后出队列 LifoQueue 简介 三.Python 线程先进后出队列 LifoQueue 函数介绍 四.Python 线 ...
- Python 线程队列 Queue – FIFO - Python零基础入门教程
目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...
- Python 线程障碍对象 Barrier - Python零基础入门教程
目录 一.Python 线程障碍对象 Barrier 简介 二.Python 线程障碍对象 Barrier 原理 三.Python 线程障碍对象 Barrier 函数介绍 四.Python 线程障碍对 ...
- Python 进程 Process 与线程 threading 区别 - Python零基础入门教程
目录 一.Python 线程 threading 创建 二.Python 进程 Process 创建 三.Python 进程 Process 和线程 threading 区别 四.Python 进程 ...
- Python globals 函数 - Python零基础入门教程
目录 一.Python globals 函数语法 二.Python globals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho ...
- Python locals 函数 - Python零基础入门教程
目录 一.locals 函数语法 二.locals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.locals ...
最新文章
- 交换机运维需要注意哪些问题,让我们一起来闲聊下
- centos设置java环境变量,CentOS设置环境变量
- GameMaker Studio 中的组合技(Combo)设置
- C++的深拷贝与浅拷贝
- python模型预测_python:目标检测模型预测准确度计算方式(基于IoU)
- Maven 使用bat批量清除本地仓库的lastUpdated文件
- 岛国人气美少女竟然每晚跟 3 个人通宵打麻将?
- Python从菜鸟到高手(1):初识Python
- N个Linux耍酷命令,手把手教你如何技术撩妹!
- grub4dos命令引导自定义映像_电脑C盘过小,教你在任意磁盘下安装windows系统,应用引导即可...
- qt5 传输 图片压缩_图片如何转换成pdf?免费教你几个宝藏方法,请低调使用!...
- linux中安装yum简单方法
- 一次性搞懂 HTTP、HTTPS、SPDY
- 【图文详解】RE文件管理器手工精简Android系统
- 磁珠 符号_关于PCB原理图中的FB-FB是磁珠的符号-电子元器件-电路图
- iOS adhoc ipa 安装
- 域名注册、域名实名认证、域名解析流程详解
- 手机计算机dj音乐,教你如何用手机制作电子音乐
- C++ Source Flowchart 自动生成C++程序流程图
- 微信小程序的开发方式有哪些
热门文章
- No.1-Apache IoTDB 随笔 - Time Series DBMS 综述
- AnalyticDB for MySQL技术架构解析
- 技术架构演进|0到千万DAU,微淘如何走过?
- Node.js 应用故障排查手册 —— 雪崩型内存泄漏问题
- 云栖专辑 | 阿里开发者们的第4个感悟:自驱是最好的进步方式
- 华南地区最大数据中心上线 阿里云河源数据中心正式开服
- 你相信逛B站也能学编程吗?
- 为什么你的年薪只是别人的月薪?你需要技术专家帮你「充电」
- 要闻君说:华为发布2018年年度报告:全球销售收入超千亿美元;微软”立誓“不过愚人节;大众与AWS一起做工业汽车云...
- Cloud一分钟 | 腾讯打造云启商学院,马化腾将担任荣誉院长;阿里巴巴:2018财年云计算收入同比增长101%...