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自然语言编码转换模块codecs介绍
Apr 08 Python
探究Python多进程编程下线程之间变量的共享问题
May 05 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
Python 迭代器与生成器实例详解
May 18 Python
Python 中Pickle库的使用详解
Feb 24 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 Python
python manage.py runserver流程解析
Nov 08 Python
Python实现图片识别加翻译功能
Dec 26 Python
sklearn的predict_proba使用说明
Jun 28 Python
python 下划线的多种应用场景总结
May 12 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命令行脚本接收传入参数的三种方式
2014/08/20 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
推荐一本PHP程序猿都应该拜读的书
2014/12/31 PHP
PHP函数超时处理方法
2016/02/14 PHP
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
js性能优化 如何更快速加载你的JavaScript页面
2012/03/17 Javascript
图片无缝滚动代码(向左/向下/向上)
2013/04/10 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
jQuery检测某个元素是否存在代码分享
2015/07/09 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
jQuery实现移动端Tab选项卡效果
2017/03/15 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
JS实现键值对遍历json数组功能示例
2018/05/30 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
WebPack工具运行原理及入门教程
2020/12/02 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python xpath获取页面注释的方法
2019/01/14 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
阿拉伯世界最大的电子商务网站:Souq沙特阿拉伯
2016/10/28 全球购物
美国著名手表网站:Timepiece
2017/11/15 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
大学生毕业自我评价范文分享
2013/11/11 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
金融管理专业求职信
2014/07/10 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
2014年医院党建工作总结
2014/12/20 职场文书
小学生成绩单评语
2014/12/31 职场文书
毛主席纪念堂观后感
2015/06/17 职场文书
生产车间管理制度
2015/08/04 职场文书
python 爬取天气网卫星图片
2021/06/07 Python