首页 > 编程语言 >Python 内置库 多线程threading使用讲解

Python 内置库 多线程threading使用讲解

时间:2024-05-14 16:21:31浏览次数:14  
标签:__ main Python threading 线程 time 多线程

线程基本使用

单线程

def main():
    print("在扔一个苹果")

if __name__ == "__main__":
    main()

多线程

Python提供了thread、threading等模块来进行线程的创建与管理,后者在线程管理能力上更进一步,因此我们通常使用threading模块。创建一个线程需要指定该线程执行的任务(函数名)、以及该函数需要的参数,

import threading
import time
def apple_1():
    print("苹果1")
    time.sleep(1)
def apple_2():
    print("苹果2")
    time.sleep(1)
def main():
    thread = threading.Thread(target=apple_1)
    thread2 = threading.Thread(target=apple_2)
    thread.start()
    thread2.start()
    print("苹果3")
    print("有多少小小丑? ", threading.active_count())
    print("这些小丑是谁呢?", threading.enumerate())

if __name__ == "__main__":
    main()

守护线程

线程是程序执行的最小单位,Python在进程启动起来后,会自动创建一个主线程,之后使用多线程机制可以在此基础上进行分支,产生新的子线程。子线程启动起来后,主线程默认会等待所有线程执行完成之后再退出。但是我们可以将子线程设置为守护线程,此时主线程任务一旦完成,所有子线程将会和主线程一起结束(就算子线程没有执行完也会退出)。
守护线程可以在线程启动之前,通过setDaemon(True)的形式进行设置,或者在创建子线程对象时,以参数的形式指定:

thread01 = Thread(target=target01, args=“”, name=“线程1”, daemon=True)

但是需要注意,如果希望主程序不等待任何线程直接退出,只有所有的线程都被设置为守护线程才有用。

设置线程阻塞

我们可以用join()方法使主线程陷入阻塞,以等待某个线程执行完毕。因此这也是实现线程同步的一种方式。参数timeout 可以用来设置主线程陷入阻塞的时间,如果线程不是守护线程,即没有设置daemon为True,那么参数timeout 是无效的,主线程会一直阻塞,直到子线程执行结束。

线程池的使用

在程序运行过程之中,临时创建一个线程需要耗费不小的代价(包括与操作系统的交互部分),尤其是我们只对一个线程分配一个简短的任务,此时,频繁的线程创建将会严重拖垮程序的执行的效率。
因此,在这种情形下,我们可以选择采用线程池技术,即通过预先创建几个空闲线程,在需要多线程来处理任务时,将任务分配给一个处于空闲状态的线程,该线程在执行完成后,将会回归空闲状态,而不是直接销毁;而如果申请从线程池中分配一个空闲线程时,遇到所有线程均处于运行状态,则当前线程可以选择阻塞来等待线程资源的空闲。如此一来,程序对于线程的管理将会更加灵活。
Python从3.2开始,就将线程池作为内置模块包含了进来,可以通过concurrent.futures.ThreadPoolExecutor来调用,使用方法也很简单。

GIL 全局解释器锁

GIL(GlobalInterpreterLock,全局解释器锁)是CPython中采用的一种机制,它确保同一时刻只有一个线程在执行Python字节码。给整个解释器加锁使得解释器多线程运行更方便,而且开发的CPython也更易于维护,但是代价是牺牲了在多处理器上的并行性。因此,在相当多的场景中,CPython解释器下的多线程机制的性能都不尽如人意

import threading
import time

def task():
    a = 0
    while a < 9999*9999:
        a += 1


def main():
    start_time = time.time()
    thread = threading.Thread(target=task)
    thread2 = threading.Thread(target=task)
    thread2.start()
    thread.start()
    thread.join()
    thread2.join()
    task()
    print("all time: ", time.time() - start_time)

标签:__,main,Python,threading,线程,time,多线程
From: https://www.cnblogs.com/hogwarts/p/18191554

相关文章

  • Python 中寻找列表最大值位置的方法
    前言在Python编程中,经常需要对列表进行操作,其中一个常见的任务是寻找列表中的最大值以及其所在的位置。本文将介绍几种方法来实现这个任务。方法一:使用内置函数max()和index()Python提供了内置函数max()来找到列表中的最大值,同时可以使用index()方法找到该最大值在......
  • 实现Python日志点击跳转到代码位置的方法
    前言在软件开发过程中,日志是一种非常重要的工具,用于记录程序运行时的状态、错误信息以及调试信息。当程序出现问题时,定位到具体的代码位置对于排查问题至关重要。本文将介绍如何在Python日志中实现点击跳转到代码位置的功能,以提高调试效率。为什么需要点击跳转功能?通常情况下,......
  • 零操作,高效下载:利用Playwright和Python完成文件下载
    前言Playwright是一个由Microsoft开发的跨浏览器自动化测试工具,它提供了强大的功能来模拟用户在浏览器中的操作。Playwright还可以应用于诸如文件下载等实际场景的测试。本文将介绍如何利用Playwright在Python中实现文件下载功能。文件下载文件下载也是我们进行web自......
  • Mysql批量插入数据(python脚本)
    有个需求:需要在table1中插入205条数据,role_id固定为65,menu_id从91开始方法二:python脚本实现PyMySQL是一个纯Python编写的MySQL客户端库,用于连接和操作MySQL数据库。以下是PyMySQL的主要功能和优点:功能:数据库连接:PyMySQL提供了connect()方法,用于建立与MySQL数据库的连接。一旦......
  • 【python】异常获取
    【日期】2024/5/14【问题】代码异常获取【分析】1、在代码中获取异常,并打印堆栈try:Qt5QWindowIcon=MainWindow.child_window(title="FJDTrionModel",class_name="Qt5QWindowIcon")exceptExceptionase:traceback.print_exc()2、......
  • [996] Upload a file to an Amazon S3 bucket and obtain the URL of it using Python
    Certainly!TouploadafiletoanAmazonS3bucketusingPython(specificallywiththeboto3library)andobtainthelink(URL)forthatfile,followthesesteps:InstallBoto3:Makesureyouhavetheboto3libraryinstalled.Ifnot,youcaninstallit......
  • 基于Python实现MapReduce
    一、什么是MapReduce首先,将这个单词分解为Map、Reduce。Map阶段:在这个阶段,输入数据集被分割成小块,并由多个Map任务处理。每个Map任务将输入数据映射为一系列(key,value)对,并生成中间结果。Reduce阶段:在这个阶段,中间结果被重新分组和排序,以便相同key的中间结果被传递到同一个R......
  • The 'nopython' keyword argument was not supplied to the 'numba.jit' decorator. T
    numba无法支持nopython错误解决错误:The'nopython'keywordargumentwasnotsuppliedtothe'numba.jit'decorator.TheimplicitdefaultvalueforthisargumentiscurrentlyFalse,butitwillbechangedtoTrueinNumba0.59.0.Seehttps://numb......
  • 多线程循环控制字段失效造成死循环的坑
    编程的时候遇到一个场景:A,B两个线程,B是一个while(flag),有个控制字段flag,刚开始是trueB会一直循环,A某个情况回把flag置为false,但是如果B的循环里什么都没干,就一直不退出,陷入死循环本来以为是哪里逻辑写错了,于是在B里面加入了一个printf,没想到结果就能正常退出了 ......
  • python 虚拟环境中无法调用git 命令 处理方法
    确认Git安装:首先,确保Git已经安装在您的系统上。打开命令行窗口,运行git--version检查Git是否已安装以及其版本。手动设置GIT_PYTHON_GIT_EXECUTABLE:如果Git已安装,但gitpython仍然找不到它,您可能需要手动设置环境变量GIT_PYTHON_GIT_EXECUTABLE。在WindowsPower......