从零开始学python | 什么是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? 

  • without creating a class
  • by extending thread class
  • without extending thread class

Advantages of using multithreading in Python

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

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

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

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

  • 基于流程
  • 基于线程

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

什么是线程?

线程基本上是独立的执行流程。一个进程可以包含多个线程。程序中的每个线程都执行特定的任务。例如,当您在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中多线程的概念有所了解。确保尽可能多地练习,因为这是编程中使用的最重要的概念之一。 

合智互联客户成功服务热线:400-1565-661

admin
admin管理员

上一篇:LiteOS内核源码分析系列七 互斥锁Mutex
下一篇:HDC.Cloud2021|华为云GaussDB让开发者们不再加班修复数据

留言评论

暂无留言
取消
扫码支持