python中的线程threading.Thread()使用详解


Posted in Python onDecember 17, 2019

1. 线程的概念:

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。

2. threading.thread()的简单使用

2.1 python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用

import threading
import time

def saySorry():
  print("亲爱的,我错了,我能吃饭了吗?")
  time.sleep(1)

if __name__ == "__main__":
  for i in range(5):
    t = threading.Thread(target=saySorry)
    t.start() #启动线程,即让线程开始执行

运行结果:

python中的线程threading.Thread()使用详解

使用说明:

  • 可以明显看出使用了多线程并发的操作,花费时间要短很多
  • 当调用start()时,才会真正的创建线程,并且开始执行
  • 每个线程都有一个唯一标示符,来区分线程中的主次关系
  • 主线程:mainThread,Main函数或者程序主入口,都可以称为主线程
  • 子线程:Thread-x 使用 threading.Thread() 创建出来的都是子线程
  • 线程数量:主线程数 + 子线程数

2.2 主线程会等待所有的子线程结束后才结束

import threading
from time import sleep,ctime

def sing():
  for i in range(3):
    print("正在唱歌...%d"%i)
    sleep(1)

def dance():
  for i in range(3):
    print("正在跳舞...%d"%i)
    sleep(1)

if __name__ == '__main__':
  print('---开始---:%s'%ctime())

  t1 = threading.Thread(target=sing)
  t2 = threading.Thread(target=dance)

  t1.start()
  t2.start()

  #sleep(5) # 屏蔽此行代码,试试看,程序是否会立马结束?
  print('---结束---:%s'%ctime())

python中的线程threading.Thread()使用详解

3.查看线程数量

import threading
from time import sleep,ctime

def sing():
  for i in range(3):
    print("正在唱歌...%d"%i)
    sleep(1)

def dance():
  for i in range(3):
    print("正在跳舞...%d"%i)
    sleep(1)

if __name__ == '__main__':
  print('---开始---:%s'%ctime())

  t1 = threading.Thread(target=sing)
  t2 = threading.Thread(target=dance)

  t1.start()
  t2.start()

  while True:
    length = len(threading.enumerate())
    print('当前运行的线程数为:%d'%length)
    if length<=1:
      break

    sleep(0.5)

python中的线程threading.Thread()使用详解

4.线程参数及顺序

4.1 传递参数的方法:

  • 使用args 传递参数 threading.Thread(target=sing, args=(10, 100, 100))
  • 使用kwargs传递参数 threading.Thread(target=sing, kwargs={“a”: 10, “b”:100, “c”: 100})
  • 同时使用 args 和 kwargs 传递参数 threading.Thread(target=sing, args=(10, ), kwargs={“b”: 100,“c”: 100})

4.2 线程的执行顺序

import socket
import threading
import time

def sing():
  for i in range(10):
    print("------------------------------")
    time.sleep(0.5)
    
def dance():
  for i in range(10):
    print("-----")
    time.sleep(0.5)

if __name__ == '__main__':
  # 创建两个子线程
  t1 = threading.Thread(target=sing)
  t2 = threading.Thread(target=dance)
  # 启动子线程
  t1.start()
  t2.start()

说明:

从代码和执行结果我们可以看出,多线程程序的执行顺序是不确定的。当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度。而线程调度将自行选择一个线程执行。上面的代码中只能保证每个线程都运行完整个run函数,但是线程的启动顺序、run函数中每次循环的执行顺序都不能确定。

5. 守护线程

守护线程:如果在程序中将子线程设置为守护线程,则该子线程会在主线程结束时自动退出,设置方式为thread.setDaemon(True),要在thread.start()之前设置,默认是false的,也就是主线程结束时,子线程依然在执行。

5.1 如下代码,主线程已经exit() 【其实并没有真正结束】,子线程还在继续执行

import threading
import time

def test():
  for i in range(10):
    print("test is run:", i)
    time.sleep(1)

if __name__ == '__main__':
  # 创建子线程
  t1 = threading.Thread(target=test)
  # 启动子线程
  t1.start()
  # 休眠2秒
  time.sleep(2)
  print("我 OVER 了")
  # 退出
  exit()

python中的线程threading.Thread()使用详解

5.2 设置守护线程

设置为守护线程(如果主线程结束了,也随之结束)
线程.setDaemon(True)

python中的线程threading.Thread()使用详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用sleep()方法操作时间的教程
May 22 Python
Python用UUID库生成唯一ID的方法示例
Dec 15 Python
Python代码实现KNN算法
Dec 20 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 Python
python实现五子棋小程序
Jun 18 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
python向图片里添加文字
Nov 26 Python
python 穷举指定长度的密码例子
Apr 02 Python
Python导入数值型Excel数据并生成矩阵操作
Jun 09 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
PyCharm下载和安装详细步骤
Dec 17 #Python
python实现指定ip端口扫描方式
Dec 17 #Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 #Python
python wxpython 实现界面跳转功能
Dec 17 #Python
python飞机大战pygame游戏背景设计详解
Dec 17 #Python
python实现名片管理器的示例代码
Dec 17 #Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 #Python
You might like
PHP预定义超全局数组变量小结
2018/08/20 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
PNG背景在不同浏览器下的应用
2009/06/22 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
2017/01/22 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
使用nodeJs来安装less及编译less文件为css文件的方法
2017/11/20 NodeJs
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
微信小程序学习笔记之函数定义、页面渲染图文详解
2019/03/28 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
python对象及面向对象技术详解
2016/07/19 Python
ubuntu系统下 python链接mysql数据库的方法
2017/01/09 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
Tensorflow实现卷积神经网络的详细代码
2018/05/24 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
对Python3 * 和 ** 运算符详解
2019/02/16 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Python使用微信itchat接口实现查看自己微信的信息功能详解
2019/08/22 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
携程英文网站:Trip.com
2017/02/07 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
珍惜资源的建议书
2014/08/26 职场文书
2019年国庆祝福语(70句)
2019/09/19 职场文书
react 路由Link配置详解
2021/11/11 Javascript