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实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
Apr 06 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
opencv python 图像去噪的实现方法
Aug 31 Python
pip指定python位置安装软件包的方法
Jul 12 Python
Python Django 前后端分离 API的方法
Aug 28 Python
Python函数式编程指南:对生成器全面讲解
Nov 19 Python
python with (as)语句实例详解
Feb 04 Python
Python参数传递机制传值和传引用原理详解
May 22 Python
django前端页面下拉选择框默认值设置方式
Aug 09 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
Dec 04 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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
javascript 导出数据到Excel(处理table中的元素)
2009/12/18 Javascript
jQuery温习篇 强大的JQuery选择器
2010/04/24 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
js获取触发事件元素在整个网页中的绝对坐标(示例代码)
2013/12/13 Javascript
使用js实现关闭js弹出层的窗口
2014/02/10 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
基于jquery实现智能提示控件intellSeach.js
2016/03/17 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
利用forever和pm2部署node.js项目过程
2017/05/10 Javascript
Vue 2.0学习笔记之Vue中的computed属性
2017/10/16 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
JS多个异步请求 按顺序执行next实现解析
2019/09/16 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
Python实现京东抢秒杀功能
2021/01/25 Python
英国高档百货连锁店:John Lewis
2017/11/20 全球购物
现代家居用品及礼品:LBC Modern
2018/06/24 全球购物
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
工程地质勘察专业大学生求职信
2013/10/13 职场文书
后勤自我鉴定
2013/10/13 职场文书
学校门卫工作职责
2013/12/07 职场文书
实习推荐信
2014/05/10 职场文书
化学专业毕业生求职信
2014/07/28 职场文书
人事任命通知
2015/04/20 职场文书
走进科学观后感
2015/06/18 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫