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中捕捉详细异常信息的代码示例
Sep 18 Python
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
Python 内置函数complex详解
Oct 23 Python
python算法表示概念扫盲教程
Apr 13 Python
Python中的探索性数据分析(功能式)
Dec 22 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
python列表生成式与列表生成器的使用
Feb 23 Python
Python实现序列化及csv文件读取
Jan 19 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
Feb 17 Python
python批量修改交换机密码的示例
Sep 22 Python
pycharm中leetcode插件使用图文详解
Dec 07 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
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
PHP积分兑换接口实例
2015/02/09 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
Checbox的操作含已选、未选及判断代码
2013/11/07 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)
2016/08/10 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
jQuery实现一个简单的验证码功能
2017/06/26 jQuery
jQuery常用选择器详解
2017/07/17 jQuery
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
Python程序退出方式小结
2017/12/09 Python
numpy数组拼接简单示例
2017/12/15 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
卫校护理专业毕业生求职信
2013/11/26 职场文书
车辆安全检查制度
2014/01/12 职场文书
行政内勤岗位职责
2014/04/07 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
标枪加油稿
2015/07/22 职场文书
2016年党员承诺书范文
2016/03/24 职场文书