时间是生活中最关键的因素。由于它的重要性,编程领域提供了各种技巧和技术,可以极大地帮助您减少时间消耗,从而提高性能。一种这样的方法是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中的线程可以通过三种方式创建:
- 无需创建课程
- 通过扩展Thread类
- 不扩展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
使用线程的优点
多线程具有许多优点,其中一些优点如下:
- 更好地利用资源
- 简化代码
- 允许同时并行执行各种任务
- 减少时间消耗或响应时间,从而提高性能。
这是检查在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)
上面的输出清楚地表明,与不使用线程执行同一程序所花费的时间相比,使用线程所花费的时间要少得多。
我希望您对本文涉及的Python中多线程的概念有所了解。确保尽可能多地练习,因为这是编程中使用的最重要的概念之一。
留言评论
暂无留言