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动态加载模块的3种方法
Nov 22 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
解决matplotlib库show()方法不显示图片的问题
May 24 Python
详解flask入门模板引擎
Jul 18 Python
Python文件读写保存操作的示例代码
Sep 14 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
Python3.6.2调用ffmpeg的方法
Jan 10 Python
python实现点击按钮修改数据的方法
Jul 17 Python
使用PyQt5实现图片查看器的示例代码
Apr 21 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
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP实现用session来实现记录用户登陆信息
2018/10/15 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
js下利用控制器载入对应脚本
2010/07/17 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
深入理解js promise chain
2016/05/05 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
easyui导出excel无法弹出下载框的快速解决方法
2016/11/10 Javascript
require、backbone等重构手机图片查看器
2016/11/17 Javascript
详解vue-cli中使用rem,vue自适应
2019/05/06 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
Django 2.0版本的新特性抢先看!
2018/01/05 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
python实现祝福弹窗效果
2019/04/07 Python
python yield和Generator函数用法详解
2020/02/10 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
美术指导求职信
2014/03/17 职场文书
《赶海》教学反思
2014/04/20 职场文书
工作说明书范文
2014/05/07 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
2019年工作总结范文
2019/05/21 职场文书
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Java 异步任务计算FutureTask
2022/04/28 Java/Android