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使用MD5加密字符串示例
Aug 22 Python
Python写的英文字符大小写转换代码示例
Mar 06 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
Python解析json时提示“string indices must be integers”问题解决方法
Jul 31 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python如何将图片转换素描画
Sep 08 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 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 $_ENV为空的原因分析
2009/06/01 PHP
一些被忽视的PHP函数(简单整理)
2010/04/30 PHP
php下连接mssql2005的代码
2011/01/17 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
2019/08/02 Javascript
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
python接口自动化(十六)--参数关联接口后传(详解)
2019/04/16 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
成人大专自我鉴定范文
2013/10/19 职场文书
会计职业生涯规划书
2014/01/13 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
入团介绍人意见范文
2015/06/04 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
七个非常实用的Python工具包总结
2021/06/15 Python
nginx.conf配置文件结构小结
2022/04/08 Servers
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python