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 sys模块sys.path使用方法示例
Dec 04 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
python实现kNN算法
Dec 20 Python
Python设计模式之MVC模式简单示例
Jan 10 Python
对python模块中多个类的用法详解
Jan 10 Python
PyQt5实现从主窗口打开子窗口的方法
Jun 19 Python
python爬虫爬取笔趣网小说网站过程图解
Nov 18 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
Python并发编程实例教程之线程的玩法
Jun 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
php入门之连接mysql数据库的一个类
2012/04/21 PHP
PHP随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
php运行提示:Fatal error Allowed memory size内存不足的解决方法
2014/12/17 PHP
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
javascript 回调函数详解
2014/11/11 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
JavaScript合并两个数组并去除重复项的方法
2015/06/13 Javascript
基于Jquery easyui 选中特定的tab
2015/11/17 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
jquery实现图片上传前本地预览功能
2016/05/10 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
玩转Koa之koa-router原理解析
2018/12/29 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
Vue 基于 vuedraggable 实现选中、拖拽、排序效果
2020/05/18 Javascript
详解JavaScript 作用域
2020/07/14 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[02:27]刀塔重生降临
2015/10/14 DOTA
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
python模块之StringIO使用示例
2015/04/08 Python
Python with用法实例
2015/04/14 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Redis使用watch完成秒杀抢购功能的代码
2018/05/07 Python
详解程序意外中断自动重启shell脚本(以Python为例)
2019/07/26 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
关于python的缩进规则的知识点详解
2020/06/22 Python
python Zmail模块简介与使用示例
2020/12/19 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
西班牙太阳镜品牌:Hawkers
2018/03/11 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物