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 相关文章推荐
gearman的安装启动及python API使用实例
Jul 08 Python
Python使用urllib模块的urlopen超时问题解决方法
Nov 08 Python
github配置使用指南
Nov 18 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
python实现简单爬虫功能的示例
Oct 24 Python
Python中django学习心得
Dec 06 Python
django实现用户注册实例讲解
Oct 30 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
Python高并发解决方案实现过程详解
Jul 31 Python
Python pysnmp使用方法及代码实例
Aug 24 Python
详解Python中的for循环
Apr 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获取MSN好友列表类的实现代码
2013/06/23 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php中JSON的使用与转换
2015/01/14 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
2016/06/13 PHP
Laravel学习教程之路由模块
2017/08/18 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
2016/10/04 Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
2017/01/08 Javascript
在 Node.js 中使用原生 ES 模块方法解析
2017/09/19 Javascript
jQuery控制input只能输入数字和两位小数的方法
2019/05/16 jQuery
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
教你使用python实现微信每天给女朋友说晚安
2018/03/23 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
详解Python3中ceil()函数用法
2019/02/19 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python 实现矩阵按对角线打印
2019/11/29 Python
使用python去除图片白色像素的实例
2019/12/12 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
Evisu官方网站:日本牛仔品牌,时尚街头设计风格
2016/12/30 全球购物
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
工作一年自我鉴定
2019/06/20 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android