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实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
利用Python开发微信支付的注意事项
Aug 19 Python
Python脚本实现12306火车票查询系统
Sep 30 Python
Python使用sorted排序的方法小结
Jul 28 Python
python使用fork实现守护进程的方法
Nov 16 Python
Python实现的计数排序算法示例
Nov 29 Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
python argparser的具体使用
Nov 10 Python
django model的update时auto_now不被更新的原因及解决方式
Apr 01 Python
Django使用echarts进行可视化展示的实践
Jun 10 Python
Python Pandas常用函数方法总结
Jun 15 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
文件上传的实现
2006/10/09 PHP
php二分法在IP地址查询中的应用
2008/08/12 PHP
深入PHP中慎用双等于(==)的详解
2013/06/06 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
用函数式编程技术编写优美的 JavaScript_ibm
2008/05/16 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
使用jquery中height()方法获取各种高度大全
2014/04/02 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
微信小程序 登录实例详解
2017/01/16 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
js图片查看器插件用法示例
2019/06/22 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
python中的全局变量用法分析
2015/06/09 Python
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
使用Bazel编译TensorBoard教程
2020/02/15 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
pytorch 移动端部署之helloworld的使用
2020/10/30 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
Farnell德国:电子元器件供应商
2018/07/10 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
校园活动策划书范文
2014/01/10 职场文书
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
小学生五一劳动节演讲稿
2015/03/18 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫