从零开始学python | 什么是Python中的多线程以及如何实现?

举报
Yuchuan 发表于 2021/04/11 00:09:15 2021/04/11
【摘要】 我希望您对本文涉及的Python中多线程的概念有所了解。确保尽可能多地练习,因为这是编程中使用的最重要的概念之一。

时间是生活中最关键的因素。由于它的重要性,编程领域提供了各种技巧和技术,可以极大地帮助您减少时间消耗,从而提高性能。一种这样的方法是Python中的多线程,这是Python认证培训中涵盖的最重要的概念之一。

这是本文涵盖的所有专业的快速摘要:

What is multitasking in Python?
What is a thread?
What is multithreading in python?
When to use multithreading in Python?
How to achieve Multithreading in Python?
How to create threads in Python? 

Advantages of using multithreading in Python

首先,让我们先开始尝试了解多任务,然后再开始学习Python中的多线程。

什么是Python中的多任务处理?

通常,多任务是同时执行多个任务的能力。用技术术语来说,多任务处理是指操作系统同时执行不同任务的能力。例如,您正在PC上下载内容,听歌和同时玩游戏等。所有这些任务均由同一OS同步执行。这不过是多任务处理,不仅可以帮助您节省时间,还可以提高生产率。

操作系统中有两种类型的多任务处理:

  • 基于流程
  • 基于线程

在本文中,您将学习基于线程的 多任务或多线程

什么是线程?

python-edureka中的threads-multithreading

线程基本上是独立的执行流程。一个进程可以包含多个线程。程序中的每个线程都执行特定的任务。例如,当您在PC上玩游戏说FIFA时,整个游戏是一个单一的过程但是它由多个线程组成,这些线程负责播放音乐,从用户处获取输入,同步运行对手等。所有这些都是单独的线程,负责在同一程序中执行这些不同的任务。

每个进程都有一个始终在运行的线程。这是主线程。该主线程实际上创建了子线程对象。子线程也由主线程启动。我将在本文中进一步向大家展示如何检查当前正在运行的线程。

因此,我希望您已经清楚地了解什么是线程。继续,让我们看看什么是Python中的多线程。

何时在Python中使用多线程?

多线程对于节省时间和提高性能非常有用,但是不能应用于所有地方。
在前面的FIFA示例中,音乐线程独立于接受您输入的线程,而接受您输入的线程独立于运行对手的线程。这些线程独立运行,因为它们不是相互依赖的。

因此,仅当各个线程之间的依赖性不存在时才可以使用多线程。

本文进一步说明了如何在Python中实现多线程。

如何在Python中实现多线程?

Python中的多线程可以通过导入线程模块来实现。

在导入该模块之前,您必须先安装它。要将其安装在您的anaconda环境上,请在anaconda提示符下执行以下命令:

conda安装-c conda-forge tbb

成功安装后,可以使用以下任何命令导入线程模块:

import threading
from threading import *

现在您已经安装了线程模块,让我们继续并在Python中执行多线程。

如何在Python中创建线程?

Python中的线程可以通过三种方式创建:

  1. 无需创建课程
  2. 通过扩展Thread类
  3. 不扩展Thread类

无需创建课程

无需创建类就可以完成Python中的多线程。这是一个演示相同内容的示例:

例子:

from threading import *
print(current_thread().getName())
def mt():
    print("Child Thread")
child=Thread(target=mt)
child.start()
print("Executing thread name :",current_thread().getName())

输出:

MainThread
子线程
执行线程名称:MainThread

上面的输出显示存在的第一个线程是主线程。然后,该主线程创建一个正在执行该功能的子线程,然后由主线程再次执行最终的打印语句。

现在,让我们继续前进,看看如何通过扩展Thread类在python中进行多线程处理。

通过扩展Thread类:

通过扩展Thread类创建子类时,该子类表示新线程正在执行某些任务。当扩展Thread类时,子类只能覆盖两个方法,即__init __()方法和run()方法。除了这两种方法外,没有其他方法可以覆盖。

这是一个如何扩展Thread类以创建线程的示例:

例子:

import threading
import time
class mythread(threading.Thread):
    def run(self):
        for x in range(7):
        print("Hi from child")
a = mythread()
a.start()
a.join()
print("Bye from",current_thread().getName())

输出:

Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Hi from child
Bye from MainThread

上面的示例显示,类myclass继承了Thread类,而子类即myclass覆盖了run方法。默认情况下,任何类函数的第一个参数都必须是self,这是指向当前对象的指针。输出显示子线程执行run()方法,主线程等待子线程执行完成。这是因为join()函数使主线程等待子进程完成。

这种创建线程的方法是最优选的方法,因为它是标准方法。但是,如果您要创建线程而不继承或扩展Thread类,则可以按以下方式进行操作。

不扩展线程类

要创建线程而不扩展Thread类,可以执行以下操作:
示例:

from threading import *
class ex:
def myfunc(self): #self necessary as first parameter in a class func
    for x in range(7):
        print("Child")
myobj=ex()
thread1=Thread(target=myobj.myfunc)
thread1.start()
thread1.join()
print("done")

输出:

Child
Child
Child
Child
Child
Child
Child
done

子线程执行myfunc,然后主线程执行最后一个print语句。


使用线程的优点

多线程具有许多优点,其中一些优点如下:

  • 更好地利用资源
  • 简化代码
  • 允许同时并行执行各种任务
  • 减少时间消耗或响应时间,从而提高性能。

这是检查在python中使用和不使用多线程的代码执行需要多长时间的示例:

例子:
import time
def sqr(n):
    for x in n:
        time.sleep(1)
        x%2
def cube(n):
    for x in n:
        time.sleep(1)
        x%3
n=[1,2,3,4,5,6,7,8]
s=time.time()
sqr(n)
cube(n)
e=time.time()
print(e-s)

输出:

16.042309284210205

以上是在不使用线程的情况下执行程序所花费的输出时间。现在让我们使用线程,看看同一程序会发生什么:

例子:

import threading
from threading import *
import time
def sqr(n):
    for x in n:
        time.sleep(1)
        print('Remainder after dividing by 2',x%2)
def cube(n):
    for x in n:
        time.sleep(1)
        print('Remainder after dividing by 3',x%3)
n=[1,2,3,4,5,6,7,8]
start=time.time()
t1=Thread(target=sqr,args=(n,))
t2=Thread(target=cube,args=(n,))
t1.start()
time.sleep(1)
t2.start()
t1.join()
t2.join()
end=time.time()
print(end-start)
输出: 9.040220737457275

上面的输出清楚地表明,与不使用线程执行同一程序所花费的时间相比,使用线程所花费的时间要少得多。

我希望您对本文涉及的Python中多线程的概念有所了解。确保尽可能多地练习,因为这是编程中使用的最重要的概念之一。 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。