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聊天程序实例代码分享
Nov 18 Python
跟老齐学Python之从格式化表达式到方法
Sep 28 Python
Python存取XML的常见方法实例分析
Mar 21 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
python与caffe改变通道顺序的方法
Aug 04 Python
pyqt5与matplotlib的完美结合实例
Jun 21 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
Python倒排索引之查找包含某主题或单词的文件
Nov 13 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
python 实用工具状态机transitions
Nov 21 Python
python3实现简单飞机大战
Nov 29 Python
浅谈Selenium 控制浏览器的常用方法
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实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
JavaScript_ECMA5数组新特性详解
2016/06/12 Javascript
JS函数多个参数默认值指定方法分析
2016/11/28 Javascript
bootstrap模态框实现拖拽效果
2016/12/14 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
详解vue中组件参数
2018/07/09 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
React中this丢失的四种解决方法
2019/03/12 Javascript
详解Vue路由自动注入实践
2019/04/17 Javascript
VUE写一个简单的表格实例
2019/08/06 Javascript
使用python实现rsa算法代码
2016/02/17 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
美国在线珠宝商店:SZUL
2017/02/11 全球购物
运动会闭幕式主持词
2015/07/01 职场文书
学习党章心得体会2016
2016/01/15 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
python数字图像处理之图像的批量处理
2022/06/28 Python