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使用htmllib分析网页内容的方法
May 08 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
python实现决策树、随机森林的简单原理
Mar 26 Python
Python爬虫之pandas基本安装与使用方法示例
Aug 08 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
图文详解python安装Scrapy框架步骤
May 20 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
Python 动态变量名定义与调用方法
Feb 09 Python
使用Matplotlib绘制不同颜色的带箭头的线实例
Apr 17 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
Django+RestFramework API接口及接口文档并返回json数据操作
Jul 12 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
用header 发送cookie的php代码
2007/03/16 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
详解PHP中的Traits
2015/07/29 PHP
PHP图片水印类的封装
2017/07/06 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JavaScript实现动态删除列表框值的方法
2015/08/12 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
简单实现IONIC购物车功能
2017/01/10 Javascript
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
tracking.js页面人脸识别插件使用方法
2020/04/16 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
Windows下安装Django框架的方法简明教程
2018/03/28 Python
python中subprocess批量执行linux命令
2018/04/27 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
python GUI计算器的实现
2020/10/09 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
学习心得体会
2014/01/01 职场文书
自我介绍演讲稿
2014/01/15 职场文书
电厂职工自我鉴定
2014/02/20 职场文书
公务员年度个人总结
2015/02/12 职场文书
新手必备Python开发环境搭建教程
2021/05/28 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
总结Python连接CS2000的详细步骤
2021/06/23 Python