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 相关文章推荐
SublimeText 2编译python出错的解决方法(The system cannot find the file specified)
Nov 27 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
Mar 30 Python
python+requests+unittest API接口测试实例(详解)
Jun 10 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
使用python的pandas为你的股票绘制趋势图
Jun 26 Python
python监控进程状态,记录重启时间及进程号的实例
Jul 15 Python
Python sep参数使用方法详解
Feb 12 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 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/07/19 PHP
php验证session无效的解决方法
2014/11/04 PHP
汇总PHPmailer群发Gmail的常见问题
2016/02/24 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
javaScript事件学习小结(四)event的公共成员(属性和方法)
2016/06/09 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
jQuery简单实现列表隐藏和显示效果示例
2016/09/12 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
PyQt5实现简易计算器
2020/05/30 Python
django 取消csrf限制的实例
2020/03/13 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
认错检讨书
2014/10/02 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
python使用torch随机初始化参数
2022/03/22 Python