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用10行代码实现对黄色图片的检测功能
Aug 10 Python
python实现class对象转换成json/字典的方法
Mar 11 Python
Python实现类似jQuery使用中的链式调用的示例
Jun 16 Python
Python中使用bidict模块双向字典结构的奇技淫巧
Jul 12 Python
python实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
Python实现简易Web爬虫详解
Jan 03 Python
高效使用Python字典的清单
Apr 04 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
Python中的self用法详解
Aug 06 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
Mar 01 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 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判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
thinkphp5.1框架中容器(Container)和门面(Facade)的实现方法分析
2019/08/05 PHP
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
原生JS实现幻灯片
2017/02/22 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
JS小球抛物线轨迹运动的两种实现方法详解
2017/12/20 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
微信小程序自定义导航栏(模板化)
2019/11/15 Javascript
详解详解Python中writelines()方法的使用
2015/05/25 Python
python中logging包的使用总结
2018/02/28 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
python requests 测试代理ip是否生效
2018/07/25 Python
pytorch程序异常后删除占用的显存操作
2020/01/13 Python
python em算法的实现
2020/10/03 Python
python 实现波浪滤镜特效
2020/12/02 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
Nixon手表英国官网:美国尼克松手表品牌
2020/02/10 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
C#面试题
2016/05/06 面试题
员工工作表现评语
2014/04/26 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
幼儿教师三分钟演讲稿
2019/06/21 职场文书
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis