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命令行参数解析OptionParser类用法实例
Oct 09 Python
python中os模块详解
Oct 14 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Python的语言类型(详解)
Jun 24 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
python 用下标截取字符串的实例
Dec 25 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
python3.7 使用pymssql往sqlserver插入数据的方法
Jul 08 Python
python datetime中strptime用法详解
Aug 29 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
使用python处理题库表格并转化为word形式的实现
Apr 14 Python
python 星号(*)的多种用途
Sep 21 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
关于crontab的使用详解
2013/06/24 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
PHP与jquery实时显示网站在线人数实例详解
2016/12/02 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
2015/08/26 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
JavaScript+Java实现HTML页面转为PDF文件保存的方法
2016/05/30 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
BootStrap+Mybatis框架下实现表单提交数据重复验证
2017/03/23 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
nodejs搭建本地服务器并访问文件操作示例
2019/05/11 NodeJs
[03:42]2016国际邀请赛中国区预选赛首日现场玩家采访
2016/06/26 DOTA
用Python编写一个基于终端的实现翻译的脚本
2015/04/24 Python
python 获取图片分辨率的方法
2019/01/08 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
bluepy 一款python封装的BLE利器简单介绍
2019/06/25 Python
用python写一个定时提醒程序的实现代码
2019/07/22 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
儿子婚宴答谢词
2014/01/09 职场文书
大学军训感言1000字
2014/02/25 职场文书
节电标语大全
2014/06/23 职场文书
联片教研活动总结
2014/07/01 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
环卫工作个人总结
2015/03/04 职场文书
员工离职通知函
2015/04/25 职场文书
初中班长竞选稿
2015/11/20 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python
dubbo服务整合zipkin详解
2021/07/26 Java/Android