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实现的简单文本类游戏实例
Apr 28 Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
pytorch实现特殊的Module--Sqeuential三种写法
Jan 15 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
图解Python中深浅copy(通俗易懂)
Sep 03 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
Python ellipsis 的用法详解
Nov 20 Python
教你使用TensorFlow2识别验证码
Jun 11 Python
python+pytest接口自动化之token关联登录的实现
Apr 06 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
在Windows系统上安装PHP运行环境文字教程
2010/07/19 PHP
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
PHP SPL标准库中的常用函数介绍
2015/05/11 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
PHP微商城开源代码实例
2019/03/27 PHP
php提高脚本性能的4个技巧
2020/08/18 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
jQuery 过滤not()与filter()实例代码
2012/05/10 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
VUE 自定义组件模板的方法详解
2019/08/30 Javascript
jQuery实现日历效果
2020/09/11 jQuery
收集的几个Python小技巧分享
2014/11/22 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python 异常处理Ⅳ过程图解
2019/10/18 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
CSS3实现点击放大的动画实例代码
2017/02/27 HTML / CSS
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
全球游戏Keys和卡片市场:GamesDeal
2018/03/28 全球购物
本科生的职业生涯规划范文
2014/01/09 职场文书
cf收人广告词
2014/03/14 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
违纪检讨书范文
2015/01/27 职场文书
语文教师求职信范文
2015/03/20 职场文书
比赛主持人开场白
2015/05/29 职场文书
Memcached介绍及php-memcache扩展安装
2021/04/01 PHP