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对字典进行排序实例
Sep 25 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
取numpy数组的某几行某几列方法
Apr 03 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
Python面向对象之类和对象属性的增删改查操作示例
Dec 14 Python
Python多线程同步---文件读写控制方法
Feb 12 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
python通过函数名调用函数的几种场景
Sep 23 Python
通过python-pptx模块操作ppt文件的方法
Dec 26 Python
Python中的 enumerate和zip详情
May 30 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
laravel dingo API返回自定义错误信息的实例
2019/09/29 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
返回页面顶部top按钮通过锚点实现(自写)
2013/08/30 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
BootStrap中的表单大全
2016/09/07 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
利用Javascript实现一套自定义事件机制
2017/12/14 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
简单介绍react redux的中间件的使用
2018/04/06 Javascript
Javascript 实现 Excel 导入生成图表功能
2018/10/22 Javascript
vue.js层叠轮播效果的实例代码
2018/11/08 Javascript
爬虫利器Puppeteer实战
2019/01/09 Javascript
解决vue v-for src 图片路径问题 404
2019/11/12 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
Python的多态性实例分析
2015/07/07 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
Python机器学习之K-Means聚类实现详解
2018/02/22 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
基于python的BP神经网络及异或实现过程解析
2019/09/30 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
tensorflow常用函数API介绍
2020/04/19 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
“型”走纽约上东区:Sam Edelman
2017/04/02 全球购物
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
德国的各种媒体在线商店:Thalia.de(书籍、电子书、玩具等)
2020/10/08 全球购物
《秋游》教学反思
2014/04/24 职场文书
成本会计岗位职责
2015/02/03 职场文书
春秋淹城导游词
2015/02/11 职场文书
2015秋季幼儿园开学寄语
2015/03/25 职场文书
物业管理交接协议书
2016/03/24 职场文书
python数字图像处理实现图像的形变与缩放
2022/06/28 Python