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中的分片与截断序列
Aug 09 Python
python 常用的基础函数
Jul 10 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
Jul 19 Python
详解python中Numpy的属性与创建矩阵
Sep 10 Python
使用Python给头像加上圣诞帽或圣诞老人小图标附源码
Dec 25 Python
Django实现从数据库中获取到的数据转换为dict
Mar 27 Python
python实现飞船大战
Apr 24 Python
Python3批量创建Crowd用户并分配组
May 20 Python
Python基于字典实现switch case函数调用
Jul 22 Python
numpy数据类型dtype转换实现
Apr 24 Python
Python Pandas 删除列操作
Mar 16 Python
Python面试不修改数组找出重复的数字
May 20 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
ThinkPHP之R方法实例详解
2014/06/20 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
鼠标悬浮停留三秒后自动显示大图js代码
2014/09/09 Javascript
IE浏览器下PNG相关功能
2015/07/05 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
Angular2使用jQuery的方法教程
2017/05/28 jQuery
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
python中pycurl库的用法实例
2014/09/30 Python
python基于socket实现网络广播的方法
2015/04/29 Python
python实现批量监控网站
2016/09/09 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
python实现简单爬虫功能的示例
2016/10/24 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
python speech模块的使用方法
2020/09/09 Python
CSS3实现的渐变幻灯片效果
2020/12/07 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
素质拓展感言
2014/01/29 职场文书
家长会演讲稿
2014/04/26 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
党员对十八届四中全会的期盼思想汇报范文
2014/10/17 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
Mysql开启外网访问
2022/05/15 MySQL