python利用线程实现多任务
作者:小名叫小明 发布时间:2023-10-02 07:15:40
我们怎么让一个 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()
运行结果:
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)
运行结果:
为了看清楚 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)
运行结果:
三、通过继承 Thread 的方式创建线程
经过我们之前的学习,能够看出,通过使用 threading 模块能完成多任务的程序开发。
但是为了让每个线程的封装性更完美,所以使用 threading 模块时,往往会定义一个新的子类 class。
子类只要继承 threading.Thread 就可以了,然后重写 run 方法。
所以说,Python 主要通过两种方式来创建线程:
使用 threading 模块中 Thread 类的构造器创建线程。即直接对类 threading.Thread 进行实例化创建线程,并调用实例化对象的 start() 方法启动线程。
继承 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 方法执行线程。
通过继承的方式来实现线程一般应用于,这个线程的逻辑比较复杂,并且分成了几个方法或函数。
来源:https://www.cnblogs.com/studyming/p/13683184.html
猜你喜欢
- 这主要是因为杀毒软件将一些asp关键词当作木马特征,记录保存着,所以遇到有这个关键词,就会禁止运行或删除。解决的方法是将这些关键词给拆开。把
- 基本上是因为jupyter notebook的kernel所用的python和命令提示符中的python环境不一样。首先分别在cmd和jup
- 长话短说:本人下载 matplotlib 花了大概三个半小时屡屡碰壁,险些暴走。为了不让新来的小伙伴走我的弯路,特意创作本片文章指明方向。1
- 1.增加维度下面给出两个样例样例1:[1, 2, 3] ==> [[1],[2],[3]]import tensorflow as t
- 一般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似:var&nb
- 本文实例为大家分享了php微信公众号获取位置信息的具体代码,供大家参考,具体内容如下<?php/** * wechat php tes
- 前言层次聚类是流行的无监督学习算法之一。层次聚类所做的就是找到数据集中具有相似属性的元素,并将它们组合在一个集群中。最后,我们得到一个单一的
- 前言喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事
- 介绍Silk是Django框架的实时分析和检查工具。源代码名称:django-silk源代码网址: http://www.git
- 环境:python3 + unittest + requestsExcel管理测试用例,HTMLTestRunner生成测试报告测试完成后邮
- 来介绍一下 Python 是采用何种途径解决循环引用问题的。上图中,表示的是对象之间的引用关系,从自对象指向他对象的引用用黑色箭头表示。每个
- 前言:之前的文章我们已经开启了爬虫程序的exe之旅,但是我们最终实现的程序存在一个非常大的问题,当进行网络请求的时候,程序卡死,直到数据请求
- 本文实例为大家分享了tkinter实现页面跳转的具体代码,供大家参考,具体内容如下主函数main.pyfrom tkinter import
- 由于最近有个任务需要在python环境下跑,项目是python3.6 + tensorflow1.3.1.现总结安装环境:卸载Python3
- 近期做个小项目需要用到python读取图片,自己整理了一下两种读取图片的方式,其中一种用到了TensorFlow,(TensorFlow是基
- 我们知道,在调用函数时如果不指定某个参数,Python 解释器会抛出异常。为了解决这个问题,Python 允许为参数设置默认值,即在定义函数
- 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding=
- 1. 横排往下会影响阅读速度。如12345678的单排单列数字,肯定是竖排阅读快。但多行多列的整块信息,横排并不见得就比竖排慢,比如所有简体
- 读取数据(Reading data)TensorFlow输入数据的方式有四种:tf.data API:可以很容易的构建一个复杂的输入通道(p
- js实现千分符转化function fmoney(s, n){ n = n > 0 && n <= 20 ? n