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程序员易犯的错误
Dec 15 Python
Python脚本实时处理log文件的方法
Nov 21 Python
scrapy爬虫完整实例
Jan 25 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
Python实现二维曲线拟合的方法
Dec 29 Python
对python_discover方法遍历所有执行的用例详解
Feb 13 Python
Django配置文件代码说明
Dec 04 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
Python json转字典字符方法实例解析
Apr 13 Python
Python filter过滤器原理及实例应用
Aug 18 Python
Python下载的11种姿势(小结)
Nov 18 Python
Python Flask搭建yolov3目标检测系统详解流程
Nov 07 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
elgg 获取文件图标地址的方法
2010/03/20 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
php绘制圆形的方法
2015/01/24 PHP
php实现微信扫码支付
2017/03/26 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
javascript Keycode对照表
2009/10/24 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
利用javascript判断文件是否存在
2013/12/31 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
AngularJS在IE8的不支持的解决方法
2016/05/13 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
值得收藏的八个常用的js正则表达式
2018/10/19 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
layui 解决form表单点击无反应的问题
2019/10/25 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
微信小程序实现左滑删除效果
2020/11/18 Javascript
Python3.x中自定义比较函数
2015/04/24 Python
python中__call__内置函数用法实例
2015/06/04 Python
Python socket处理client连接过程解析
2020/03/18 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据
2020/12/13 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
3个CCIE对一个工程师的面试题
2012/05/06 面试题
建筑经济管理专业求职信分享
2014/01/06 职场文书
奶茶店创业计划书范文
2014/01/17 职场文书
祝寿主持词
2015/07/02 职场文书
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python