Python 3线程的详细指南

213 阅读5分钟

Python 3线程的介绍

Python 3线程有时是一种轻量级的进程,因为它不像进程那样使用大量的内存,而且成本较低。使用许多线程就相当于同时运行多个应用程序。在python 3线程中,多个线程与主线程处理相同的数据,这使得共享信息和通信比独立进程更容易。

什么是python 3线程?

  • Python 3线程有一个开始、中间和结束。它包含指令的指针,跟踪它目前在其上下文中的运行位置。
  • 在python 3中,有两种类型的线程可用,如下所示:
  1. 内核线程
  2. 用户线程
  • 内核线程是操作系统的一部分。因此,当运行内核线程时,它将在操作系统上执行。同时,用户空间线程不是操作系统的一部分。
  • Python 3 包含两个支持线程使用的模块,如下所示:
  1. _thread
  2. 线程
  • 在很长一段时间内,线程模块被认为是 "废弃的"。 与其使用线程模块,不如敦促用户使用它。因此,"线程 "模块在Python 3中已经不存在了。为了在Python3中向后兼容,线程的名字被重新命名为_thread。
  • Python 3线程允许我们同时运行程序的许多部分,如果我们以前使用过Python,并希望使用线程来加快代码的执行,那么我们的设计就会更容易。
  • 一个线程是一个不同于程序其他部分的执行流。这意味着在我们的软件中会有两件事同时发生。
  • 很容易想象,Python 3线程包含更多的处理器同时在我们的应用程序上工作,每个人都做自己的事情。不幸的是,这与事实很接近。线程可能在多个处理器上运行,但在任何时候都只有一个处理器处于活动状态。
  • 要让许多工作同时运行,就必须利用非标准的Python实现,并采用多处理方式,这是有代价的。
  • 由于Python的工作方式,线程可能不会加快所有任务的速度。这无非是与GIL的互动,它有效地限制了可以同时运行的Python线程的数量。
  • 线程对于那些花很多时间处理外部事件的任务来说是非常合适的。然而,需要大量的CPU处理,但几乎没有时间等待外部事件的问题可能无法快速运行。
  • 在构造一个线程的时候,我们会给出一组参数。例如,在这种情况下,我们指示Thread调用以参数一为基础的线程函数。

什么时候使用Python 3线程?

  • 这是一个节省时间和提高应用程序速度的好方法。此外,多线程使程序员能够将应用任务分解成小块,并同时运行。
  • 它还能提升用户使用软件的意愿,即使其中有一段太长或被封锁。
  • 它允许我们同时执行众多的线程,在CPU的帮助下,在这些线程之间快速切换,称为上下文切换。
  • 此外,它允许它与进程内的主要线程分享其存储空间,使它们比独立的进程更容易分享信息和与其他线程沟通。
  • 多线程试图同时完成几个活动,提高程序效率、速度和渲染效果。

下面的例子显示了我们何时可以使用python 3线程。在下面的例子中,我们在join方法中使用python 3线程。

  • Join方法停止主线程,等待线程对象完成执行。Python中的主线程是在线程对象完成后启动的。

代码 -

import threading
def print_hello(n):
print("What is the Name of Student:- ",n)
Thread1 = threading.Thread (target = print_hello, args = ('ABC', ))
Thread1.start ()
Thread1.join ()
print ("Python 3 threading")

输出

Python 3 Threading output 1

我们也可以使用Python 3线程来创建多个线程对象。

代码--

import threading
def worker():
print ('Python 3 thread')
return
t1 = []
for i in range(5):
t2 = threading.Thread(target=worker)
t1.append(t2)
t2.start()

输出

Python 3 Threading output 2

Python 3线程的应用

  • 线程可以并发操作;多线程程序可以在有多个CPU的计算机上更快地运行。
  • 一个程序对输入的响应可以保持。这同时适用于单处理器和多处理器系统。
  • 全局变量可以在一个进程的所有线程中共享。如果一个线程修改了一个全局变量,这个变化会影响到所有线程。同样地,局部变量也可能存在于一个线程中。对于一个操作系统来说,线程管理比进程管理更容易。
  • 线程同步机制保证了应用程序中没有两个线程可以同时访问相同的共享资源。可以用关键部分来描述这种情况。
  • 下面的例子显示了python中的线程应用,如下所示。

代码 -

import threading
def print_cube (num):
print("Cube is : {}".format(num * num * num))
def print_square(num):
print("Square is : {}".format(num * num))
if __name__ == "__main__":
t1 = threading.Thread (target=print_square, args=(5,))
t2 = threading.Thread (target=print_cube, args=(5,))
t1.start ()
t2.start ()
t1.join ()
t2.join ()
print ("Application Code executed successfully!!")

输出

Python 3 Threading output 3

Python 3线程程序实例

下面的例子显示了Python 3的线程,如下。我们正在打印线程名称,如下所示。

代码--

import threading
import os
def work1():
print("Work1 is assigned to the thread: {}".format(threading.current_thread().name))
print("Running task 1: {}".format(os.getpid()))
def work2():
print("Work2 is assigned to the thread: {}".format(threading.current_thread().name))
print("Running task 2: {}".format(os.getpid()))
if __name__ == "__main__":
print("Running main program: {}".format(os.getpid()))
print("Main thread: {}".format(threading.current_thread().name))
t1 = threading.Thread(target=work1, name='t1')
t2 = threading.Thread(target=work2, name='t2')
t1.start()
t2.start()
t1.join()
t2.join()

输出

output 4

下面的例子显示了使用Python 3线程的学生的年龄。

代码 - 输出

import threading
def print_hello(n):
print ("What is the age of student:- ", n)
Thread1 = threading.Thread (target = print_hello, args = (10, ))
Thread1.start ()
Thread1.join ()
print ("Python 3 threading")

输出

output 5

结论

Python 3线程有一个开始、中间和结束。它包含指令的指针,跟踪它目前在其上下文中的运行位置。线程使线程之间能够相互通信,并在同一处理器上共享资源,如文件、数据和内存。