python利用线程实现多任务


Posted in Python onSeptember 18, 2020

我们怎么让一个 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()

运行结果:

python利用线程实现多任务

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)

运行结果:

python利用线程实现多任务

为了看清楚 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)

运行结果:

python利用线程实现多任务

三、通过继承 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 线程实现多任务的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
python类和函数中使用静态变量的方法
May 09 Python
pycharm中连接mysql数据库的步骤详解
May 02 Python
深入分析python数据挖掘 Json结构分析
Apr 21 Python
django框架防止XSS注入的方法分析
Jun 21 Python
Python OpenCV 使用滑动条来调整函数参数的方法
Jul 08 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
Django认证系统user对象实现过程解析
Mar 02 Python
实现ECharts双Y轴左右刻度线一致的例子
May 16 Python
Python3 搭建Qt5 环境的方法示例
Jul 16 Python
Python绘图之柱形图绘制详解
Jul 28 Python
解决python3.6用cx_Oracle库连接Oracle的问题
Dec 07 Python
Pycharm的Available Packages为空的解决方法
Sep 18 #Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 #Python
pycharm 代码自动补全的实现方法(图文)
Sep 18 #Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 #Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 #Python
浅谈python 类方法/静态方法
Sep 18 #Python
python 6行代码制作月历生成器
Sep 18 #Python
You might like
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
php 可变函数使用小结
2018/06/12 PHP
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
深入解析JavaScript中的arguments对象
2016/06/12 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
node中间层实现文件上传功能
2018/06/11 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
Python中的默认参数详解
2015/06/24 Python
详细解读Python中解析XML数据的方法
2015/10/15 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
Python数据可视化图实现过程详解
2020/06/12 Python
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
就业自荐书
2013/12/05 职场文书
公司文体活动总结
2015/05/07 职场文书
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
Win11 25163.1010更新补丁KB5016904推送,测试服务验证管道(附更新修复汇总)
2022/07/23 数码科技