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的身份证号码自动生成程序
Aug 15 Python
给Python IDLE加上自动补全和历史功能
Nov 30 Python
Python装饰器原理与简单用法实例分析
Apr 29 Python
python中ASCII码和字符的转换方法
Jul 09 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
Dec 16 Python
PyCharm设置每行最大长度限制的方法
Jan 16 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
python retrying模块的使用方法详解
Sep 25 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
在Python 的线程中运行协程的方法
Feb 24 Python
python实现最速下降法
Mar 24 Python
tensorflow实现将ckpt转pb文件的方法
Apr 22 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开启gzip页面压缩实例
2013/06/09 PHP
php后门URL的防范
2013/11/12 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
js基础之DOM中元素对象的属性方法详解
2016/10/28 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
让python json encode datetime类型
2010/12/28 Python
Python操作MySQL数据库的方法
2018/06/20 Python
python搜索包的路径的实现方法
2019/07/19 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
Django stark组件使用及原理详解
2019/08/22 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
Python函数生成器原理及使用详解
2020/03/12 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
keras使用Sequence类调用大规模数据集进行训练的实现
2020/06/22 Python
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
会计专业毕业生推荐信
2013/11/05 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
幼儿教师辞职信范文
2015/03/02 职场文书
亮剑观后感
2015/06/05 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
2021/04/04 Servers
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
python工具dtreeviz决策树可视化和模型可解释性
2022/03/03 Python