当前位置: 首页 > 后端技术 > Python

Python多线程教程

时间:2023-03-25 22:31:43 Python

在此Python多线程教程中,您将看到创建线程的不同方法,并学习实现线程安全操作的同步。本文的每个部分都包含一个示例和示例代码,以逐步解释概念。顺便说一句,多线程是几乎所有高级编程语言都支持的软件编程的核心概念。因此,您首先应该了解的是:什么是线程以及多线程在计算机科学中的含义。什么是计算机科学中的线程?在软件编程中,线程是具有独立指令集的最小执行单元。它是进程的一部分,并在共享程序可运行资源(例如内存)的相同上下文中运行。一个线程有一个起点、一个执行顺序和一个结果。它有一个指令指针,用于保存线程的当前状态并控制接下来执行的顺序。什么是计算机科学中的多线程?进程并行执行多个线程的能力称为多线程。理想情况下,多线程可以显着提高任何程序的性能。而且Python的多线程机制非常人性化,可以很快学会。多线程的优点多线程可以显着提高多处理器或多核系统的计算速度,因为每个处理器或内核同时处理一个单独的线程。多线程允许程序在一个线程等待输入而另一个线程运行GUI时保持响应。此声明适用于多处理器或单处理器系统。一个进程的所有线程都可以访问它的全局变量。如果一个全局变量在一个线程中被改变,它对其他线程也是可见的。线程也可以有自己的局部变量。多线程的缺点在单处理器系统上,多线程不影响计算速度。由于管理线程的开销,性能可能会下降。访问共享资源时需要同步,防止互斥。它直接导致更多的内存和CPU使用率。多线程增加了程序的复杂性,这也使调试变得困难。它增加了潜在死锁的可能性。当线程无法定期访问共享资源时,它会导致饥饿。该应用程序将无法恢复其工作。到目前为止,您已经了解了线程的理论概念。如果您是Python新手,我们建议您阅读我们的30个快速Python编码技巧,它也可以帮助您编写Python多线程代码。我们的许多读者都使用了这些技巧,并且能够提高他们的编码技能。Python多线程模块Python提供了两个模块来实现程序中的线程。模块和模块。注意:供您参考,Python2.x曾经有模块。但它在Python3.x中被弃用并重命名为<_thread>模块以实现向后兼容。这两个模块的主要区别在于模块<_threads>将线程作为函数来实现。另一方面,模块提供了一种面向对象的方法来启用线程创建。如何使用线程模块创建线程?如果您决定在您的程序中使用模块,请使用以下方法生成线程。#Syntaxthread.start_new_thread(function,args[,kwargs])这种方法对于创建线程来说非常高效和直接。您可以使用它在Linux和Windows中运行程序。此方法启动一个新线程并返回其标识符。它将使用传递的参数列表调用指定为“函数”参数的函数。当返回时,线程将静默退出。在这里,args是一个参数元组;使用空元组调用而不带任何参数。可选的参数指定关键字参数的字典。**如果由于未处理的异常而终止,则会打印堆栈跟踪并退出线程(它不会影响其他线程,它们会继续运行)。使用下面的代码了解有关线程的更多信息。基本Python多线程示例#Python多线程示例。#1。使用递归计算阶乘。#2。使用线程调用阶乘函数。from_threadimportstart_new_threadfromtimeimportsleepthreadId=1#threadcounterwaiting=2#2秒等待时间deffactorial(n):globalthreadIdrc=0ifn<1:#basecaseprint("{}:{}".format('\nThread',threadId))threadId+=1rc=1else:returnNumber=n*factorial(n-1)#递归调用print("{}!={}".format(str(n),str(returnNumber)))rc=returnNumberreturnrcstart_new_thread(factorial,(5,))start_new_thread(factorial,(4,))print("Waitingforthreadstoreturn...")sleep(waiting)中运行上面的代码终端,或使用任何在线Python终端。执行此程序后,将产生以下输出。程序输出#Python多线程:程序输出-等待线程返回...Thread:11!=12!=23!=64!=245!=120Thread:21!=12!=23!=64!=24How使用threading模块创建线程?最新的模块提供了比上一节中讨论的遗留模块更丰富的功能和更好的线程支持。模块是Python多线程的一个很好的例子。模块结合了模块的所有方法,并公开了一些额外的方法threading.activeCount():用于计算总数。活动线程对象。threading.currentThread():您可以使用它来确定调用者的线程控制中线程对象的数量。threading.enumerate():它将为您提供当前活动线程对象的完整列表。除了以上方法,模块还提供了类,你可以尝试实现线程。它是Python多线程的面向对象变体。使用线程模块实现线程的步骤您可以使用模块实现新线程,如下所示。从类构造一个子类。覆盖方法以根据要求提供参数。接下来重写方法,写线程的业务逻辑。一旦定义了一个新的子类,就必须实例化它以启动一个新线程。然后,调用方法启动它。它最终会调用方法来执行业务逻辑。示例-创建一个线程类来打印日期#Python多线程示例来打印当前日期。#1。使用threading.Thread类来定义子类。#2。实例化子类并触发线程。importthreadingimportdatetimeclassmyThread(threading.Thread):def__init__(self,name,counter):threading.Thread.__init__(self)self.threadID=counterself.name=nameself.counter=counterdefrun(self):打印("\nStarting"+self.name)print_date(self.name,self.counter)print("Exiting"+self.name)defprint_date(threadName,counter):datefields=[]today=datetime.date.today()datefields.append(today)print("{}[{}]:{}".format(threadName,counter,datefields[0]))#创建一个新线程thread1=myThread("Thread",1)thread2=myThread("Thread",2)#启动一个新线程thread1.start()thread2.start()thread1.join()thread2.join()print("\nExitingtheProgram!!!")ProgramoutputStartingThreadThread[1]:2021-07-22ExitingThreadStartingThreadThread[2]:2021-07-22ExitingThreadExitingtheProgram!!!PythonMultithreading-SynchronizingThreads模块具有用于实现锁定的内置函数,允许您同步线程。需要锁定来控制对共享资源的访问,以防止数据损坏或丢失。您可以通过调用Lock()方法来应用锁,该方法返回一个新的锁对象。然后您可以调用锁定对象的获取(阻塞)方法来强制线程同步运行。可选的阻塞参数指定线程是否等待获取锁。CaseBlocking=0:如果获取锁失败线程将立即返回一个值,如果获取锁成功则返回一个值。CaseBlocking=1:线程阻塞并等待锁被释放。锁对象的release()方法用于在不再需要锁时释放锁。仅供参考,由于用于操作它们的原子字节码的副作用,Python的内置数据结构(例如列表、字典)是线程安全的。在Python中实现的其他数据结构或原始类型(例如整数和浮点数)没有此保护。为了防止同时访问一个对象,我们使用了一个Lock对象。锁定的多线程示例#Python多线程示例来演示锁定。#1。使用threading.Thread类来定义子类。#2。实例化子类并触发线程。#3。在线程的run方法中实现锁。importthreadingimportdatetimeexitFlag=0classmyThread(threading.Thread):def__init__(self,name,counter):threading.Thread.__init__(self)self.threadID=counterself.name=nameself.counter=counterdefrun(self)复制代码:print("\nStarting"+self.name)#获取锁同步线程threadLock.acquire()print_date(self.name,self.counter)#为下一个线程释放锁threadLock.release()print("Exiting"+self.name)defprint_date(threadName,counter):datefields=[]today=datetime.date.today()datefields.append(today)print("{}[{}]:{}".format(threadName,counter,datefields[0]))threadLock=threading.Lock()threads=[]#创建一个新线程thread1=myThread("Thread",1)thread2=myThread("Thread",2)#开始一个新线程thread1.start()thread2.start()#添加线程到线程列表threads.append(thread1)threads.append(thread2)#等待所有线程完成forthreadinthreads:thread.join()print("\nExiting程序!!!”)程序输出开始线程数阅读[1]:2021-07-22ExitingThreadStartingThreadThread[2]:2021-07-22ExitingThreadExitingtheProgram!!!