Python中的多线程详细解读1

2021年3月10日16:09:44 发表评论 933 次浏览

本文介绍了Python编程语言中的多线程基础知识。就像多处理, 多线程是一种实现多任务的方法。在多线程中, 线程数用来。

让我们先了解一下线在计算机体系结构中。

线程

在计算中, 处理是正在执行的计算机程序的实例。任何过程都包含3个基本组成部分:

  • 可执行程序。
  • 程序所需的关联数据(变量, 工作空间, 缓冲区等)
  • 程序的执行上下文(进程状态)

一种线是流程中可以安排执行的实体。另外, 它是可以在OS(操作系统)中执行的最小处理单位。

简单来说, 线是程序中此类指令的序列, 可以独立于其他代码执行。为简单起见, 你可以假定线程只是进程的子集!

线程将所有这些信息包含在线程控制块(TCB):

  • 线程标识符:唯一ID(TID)被分配给每个新线程
  • 堆栈指针:在此过程中指向线程的堆栈。堆栈包含线程范围内的局部变量。
  • 程序计数器:一个寄存器, 用于存储线程当前正在执行的指令的地址。
  • 线程状态:可以运行, 准备, 等待, 开始或完成。
  • 线程的寄存器集:分配给线程进行计算的寄存器。
  • 父进程指针:指向线程所驻留的进程的进程控制块(PCB)的指针。

考虑下图以了解进程及其线程之间的关系:

Python中的多线程|套装11

多线程

一个进程中可以存在多个线程, 其中:

  • 每个线程包含其自己的寄存器集和局部变量(存储在堆栈中).
  • 进程共享的所有线程全局变量(存储在堆中)和程式码.

考虑下图以了解内存中如何存在多个线程:

Python中的多线程|套装12

多线程定义为处理器同时执行多个线程的能力。

在简单的单核CPU中, 可以通过频繁地在线程之间进行切换来实现。这称为上下文切换。在上下文切换中, 无论何时发生任何中断(由于I / O或手动设置), 都会保存线程的状态并加载另一个线程的状态。上下文切换发生得如此频繁, 以至于所有线程似乎都在并行运行(这被称为多任务处理)。

考虑下图, 其中一个进程包含两个活动线程:

Python中的多线程|套装13

Python中的多线程

在Python中, 穿线模块提供了一个非常简单直观的API, 用于在程序中生成多个线程。

让我们考虑一个使用线程模块的简单示例:

# Python program to illustrate the concept
# of threading
# importing the threading module
import threading
  
def print_cube(num):
     """
     function to print cube of given num
     """
     print ( "Cube: {}" . format (num * num * num))
  
def print_square(num):
     """
     function to print square of given num
     """
     print ( "Square: {}" . format (num * num))
  
if __name__ = = "__main__" :
     # creating thread
     t1 = threading.Thread(target = print_square, args = ( 10 , ))
     t2 = threading.Thread(target = print_cube, args = ( 10 , ))
  
     # starting thread 1
     t1.start()
     # starting thread 2
     t2.start()
  
     # wait until thread 1 is completely executed
     t1.join()
     # wait until thread 2 is completely executed
     t2.join()
  
     # both threads completely executed
     print ( "Done!" )
Square: 100
Cube: 1000
Done!

让我们尝试理解上面的代码:

要导入线程模块, 我们要做:

import threading

要创建一个新线程, 我们创建一个对象

线

类。它采用以下参数:

  • 目标:线程执行的功能
  • args:要传递给目标函数的参数

在上面的示例中, 我们创建了两个具有不同目标函数的线程:

t1 = threading.Thread(target=print_square, args=(10, ))
t2 = threading.Thread(target=print_cube, args=(10, ))

要启动线程, 我们使用

开始

的方法

线

类。

t1.start()
t2.start()

线程启动后, 当前程序(你可以将其视为主线程)也继续执行。为了在线程完成之前停止当前程序的执行, 我们使用

加入

方法。

t1.join()
t2.join()

结果, 当前程序将首先等待完成t1接着t2。一旦完成, 将执行当前程序的其余语句。

考虑下图, 以更好地理解上述程序的工作原理:

Python中的多线程|套装14

考虑下面给出的python程序, 其中我们为每个任务打印线程名称和相应的进程:

# Python program to illustrate the concept
# of threading
import threading
import os
  
def task1():
     print ( "Task 1 assigned to thread: {}" . format (threading.current_thread().name))
     print ( "ID of process running task 1: {}" . format (os.getpid()))
  
def task2():
     print ( "Task 2 assigned to thread: {}" . format (threading.current_thread().name))
     print ( "ID of process running task 2: {}" . format (os.getpid()))
  
if __name__ = = "__main__" :
  
     # print ID of current process
     print ( "ID of process running main program: {}" . format (os.getpid()))
  
     # print name of main thread
     print ( "Main thread name: {}" . format (threading.current_thread().name))
  
     # creating threads
     t1 = threading.Thread(target = task1, name = 't1' )
     t2 = threading.Thread(target = task2, name = 't2' )  
  
     # starting threads
     t1.start()
     t2.start()
  
     # wait until all threads finish
     t1.join()
     t2.join()
ID of process running main program: 11758
Main thread name: MainThread
Task 1 assigned to thread: t1
ID of process running task 1: 11758
Task 2 assigned to thread: t2
ID of process running task 2: 11758

让我们尝试理解上面的代码:

我们用

os.getpid()

函数获取当前进程的ID。

print("ID of process running main program: {}".format(os.getpid()))

从输出中可以明显看出, 所有线程的进程ID均相同。

我们用

threading.main_thread()

函数获取主线程对象。在正常情况下, 主线程是启动Python解释器的线程。

名称

线程对象的属性用于获取线程的名称。

print("Main thread name: {}".format(threading.main_thread().name))

我们使用

threading.current_thread()

函数获取当前线程对象。

print("Task 1 assigned to thread: {}".format(threading.current_thread().name))

下面给出的图清除了以上概念:

Python中的多线程|套装15

因此, 这是Python多线程的简要介绍。本系列的下一篇文章将介绍多线程之间的同步.

Python中的多线程|设置2(同步)

如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。

注意怪胎!巩固你的基础Python编程基础课程和学习基础知识。

首先, 你的面试准备可通过以下方式增强你的数据结构概念:Python DS课程。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: