python利用线程实现多任务

 更新时间:2020年09月18日 10:50:15   作者:小名叫小明  
这篇文章主要介绍了python利用线程实现多任务,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下

我们怎么让一个 Python 程序里边实现多任务呢?

实现多任务可以有多种方式,这里我们先了解使用线程的方式实现多任务。

线程是实现多任务的一种的手段。

其实用的是 threading 模块,threading 模块里有一个类叫 Thread。

Python 的 thread 模块是比较底层的模块,Python 的 threading 模块是对 thread 做了一些包装的,可以更加方便的被使用。

一、通过构造器传函数的方式创建线程

我们先来看一个实例:

import time
import threading

def saySorry():
  print("亲爱的,我错了,我能吃饭了么?")
  time.sleep(1)

if __name__ == "__main__":
  for i in range(5):
    t = threading.Thread(target=saySorry)
    # 启动线程,即让线程开始执行
    t.start()

运行结果:

threading.Thread 创建了一个对象,但是不会创建线程。

当调用 Thread 创建出来的实例对象 t.start() 执行的时候,才会创建线程,并且让这个线程开始运行。

一个程序运行起来之后,一定有一个执行代码的东西。这个东西就称之为线程。

一个程序运行的时候,有一个主线程,当 t.start() 执行的时候,就会创建一个子线程,子线程可以单独去执行,这就实现了多任务的运行。

二、查看程序中的线程数量

如果想知道程序中线程的数量,可以调用 threading 中的 enumerate(),它返回了一个当前程序中运行的线程的列表,包括主线程自己。

import threading
from time import sleep

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__':

  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)

运行结果:

为了看清楚 enumerate() 究竟是什么,我们修改下代码打印 enumerate(),更能看清楚线程的数量和状态。

import threading
from time import sleep

def sing():
  for i in range(5):
    print("正在唱歌...%d" % i)
    sleep(1)


def dance():
  for i in range(3):
    print("正在跳舞...%d" % i)
    sleep(1)


if __name__ == '__main__':

  t1 = threading.Thread(target=sing)
  t2 = threading.Thread(target=dance)

  t1.start()
  t2.start()

  while True:
    print(threading.enumerate())

    if len(threading.enumerate()) <= 1:
      break

    sleep(0.5)

运行结果:

三、通过继承 Thread 的方式创建线程

经过我们之前的学习,能够看出,通过使用 threading 模块能完成多任务的程序开发。

但是为了让每个线程的封装性更完美,所以使用 threading 模块时,往往会定义一个新的子类 class。

子类只要继承 threading.Thread 就可以了,然后重写 run 方法。

所以说,Python 主要通过两种方式来创建线程:

  1. 使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。
  2. 继承 threading 模块中的 Thread 类创建线程类。即用 threading.Thread 派生出一个新的子类,将新建类实例化创建线程,并调用其 start() 方法启动线程。

运行结果:

I'm Thread-1 @ 0
I'm Thread-1 @ 1
I'm Thread-1 @ 2

Python 的 threading.Thread 类有一个 run 方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。

而创建自己的线程实例后,通过 Thread 类的 start 方法,可以启动该线程,交给 Python 虚拟机进行调度,当该线程获得执行的机会时,就会调用 run 方法执行线程。

通过继承的方式来实现线程一般应用于,这个线程的逻辑比较复杂,并且分成了几个方法或函数。

以上就是python利用线程实现多任务的详细内容,更多关于python 线程实现多任务的资料请关注脚本之家其它相关文章!

相关文章

  • 详解如何在Matplotlib中绘制平滑曲线

    详解如何在Matplotlib中绘制平滑曲线

    这篇文章主要为大家详细介绍了如何在Matplotlib中绘制平滑曲线,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考下
    2024-04-04
  • Django中URL视图函数的一些高级概念介绍

    Django中URL视图函数的一些高级概念介绍

    这篇文章主要介绍了Django中URL视图函数的一些高级概念,Django是Python重多人气框架中最为著名的一个,需要的朋友可以参考下
    2015-07-07
  • 结束运行python的方法

    结束运行python的方法

    在本篇文章里小编给大家分享的是关于结束运行python的方法以及相关代码,有需要的朋友们跟着学习下。
    2020-06-06
  • Python面向对象特殊属性及方法解析

    Python面向对象特殊属性及方法解析

    这篇文章主要介绍了Python面向对象特殊属性及方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 让python的Cookie.py模块支持冒号做key的方法

    让python的Cookie.py模块支持冒号做key的方法

    虽然Cookie的标准是不允许:冒号出现在key里面的,但是我们的开发人员是很可爱的,常常会让我们意想不到。
    2010-12-12
  • Python3实现的简单工资管理系统示例

    Python3实现的简单工资管理系统示例

    这篇文章主要介绍了Python3实现的简单工资管理系统,涉及Python文件读写、数据遍历、判断等相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Win10下Python3.7.3安装教程图解

    Win10下Python3.7.3安装教程图解

    到2019年初,Python3已经更新到了Python3.7.3,Python有两个大版本Python2和Python3,Python3是现在和未来的主流。这篇文章主要介绍了Win10下Python3.7.3安装教程图解,非常不错,感兴趣的朋友跟随小编一起看看吧
    2019-07-07
  • Matplotlib 3D 绘制小红花原理

    Matplotlib 3D 绘制小红花原理

    这篇文章主要介绍了Matplotlib 3D 绘制小红花原理,小编上一篇文章一家介绍了绘制小红化,本篇博文主要介绍一下3D小红花的绘制原理,看过上篇博文的朋友可以参考一下
    2022-02-02
  • Python Tornado 实现SSE服务端主动推送方案

    Python Tornado 实现SSE服务端主动推送方案

    SSE是Server-Sent Events 的简称,是一种服务器端到客户端(浏览器)的单项消息推送,本文主要探索两个方面的实践一个是客户端发送请求,服务端的返回是分多次进行传输的,直到传输完成,这种情况下请求结束后,考虑关闭SSE,所以这种连接可以认为是暂时的,感兴趣的朋友一起看看吧
    2024-01-01
  • Python入门教程1. 基本运算【四则运算、变量、math模块等】

    Python入门教程1. 基本运算【四则运算、变量、math模块等】

    这篇文章主要介绍了Python教程的基本运算,包括四则运算、变量的使用与类型检测、math模块等,并附带了相关说明,代码备有较为详尽的说明,便于理解,需要的朋友可以参考下
    2018-10-10

最新评论