#渗透测试#SRC漏洞挖掘#Python自动化脚本的编写05之多线程与多进程

news2024/11/22 14:11:08

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章阅读。

目录

一、Python多线程与多进程选择依据

1、多线程与多进程的基本概念

2、Python多线程的特点及应用场景

3、Python多进程的特点及应用场景

4、选择依据

二、Python多线程

1. 线程的基本概念

2. 线程的创建与管理

3. 线程同步

4. 线程池

5. 多线程的适用场景

6. GIL的影响

三、Python多线程优化技巧

1. 合理的线程数量

2. 避免全局解释器锁(GIL)

3. 数据共享与同步

4. 优化线程任务

5. 使用高效的库和工具

 四、Python多线程编程入门教程

1. 线程同步

2. 结束线程

3. 线程池

五、Python多进程

1. 多进程的基本概念

2. 多进程的创建与管理

3. 进程间通信

4. 进程池

5. 多进程的适用场景

6. 注意事项

六、Python多进程优化技巧

1. 使用进程池

2. 避免进程间通信

3. 合理划分任务

4. 避免全局变量

5. 使用合适的进程数量

6. 使用性能分析工具

七、Python多进程编程入门教程

1. 安装Python

2. 导入必要的模块

3. 创建进程

4. 进程间通信

5. 使用进程池

 八、如何监控多线程和多进程

1、监控多线程

2、监控多进程


一、Python多线程与多进程选择依据

在Python中,选择多线程(threading)还是多进程(multiprocessing)主要取决于具体的应用场景和需求。以下是对两者选择依据的详细分析:

1、多线程与多进程的基本概念

  1. 线程:线程是CPU调度的最小单位,是进程中的一个执行单元。线程共享进程的内存空间,因此创建和销毁线程的开销相对较小。
  2. 进程:进程是资源分配的最小单位,每个进程拥有独立的内存空间和系统资源。进程之间互不干扰,具有较高的独立性。

2、Python多线程的特点及应用场景

  1. 特点
    • 由于Python的全局解释器锁(GIL)的存在,多线程在Python中无法实现真正的并行执行,而是交替执行。
    • 线程之间的切换开销较小,通信方便,因为共享进程的内存空间。
  2. 应用场景
    • IO密集型任务:如网络通信、文件读写等。这类任务大部分时间都在等待外部资源,使用多线程可以充分利用等待时间,提高程序效率。
    • GUI程序:由于GUI程序通常需要响应用户输入和进行界面更新,使用多线程可以避免界面冻结,提高用户体验。

3、Python多进程的特点及应用场景

  1. 特点
    • 每个进程拥有独立的内存空间和系统资源,可以实现真正的并行执行。
    • 进程之间的切换开销较大,通信需要使用进程间通信(IPC)机制。
  2. 应用场景
    • 计算密集型任务:如科学计算、图像处理等。这类任务需要大量的CPU资源,使用多进程可以充分利用多核CPU,提高计算速度。
    • 需要独立运行环境的任务:如需要独立运行环境的程序或脚本,使用多进程可以确保任务之间互不干扰。

4、选择依据

  1. 任务类型:根据任务的类型(IO密集型或计算密集型)来选择多线程或多进程。IO密集型任务适合使用多线程,计算密集型任务适合使用多进程。
  2. 资源需求:根据任务对资源的需求来选择。如果任务需要大量的CPU资源,且可以并行执行,那么选择多进程;如果任务主要需要等待外部资源,且需要频繁地进行线程切换和通信,那么选择多线程。
  3. 程序复杂性:多线程编程相对简单,因为线程共享进程的内存空间;而多进程编程相对复杂,因为进程之间需要通信和同步。如果程序复杂性较高,且对性能要求不是特别严格,那么可以选择多线程。
  4. 平台限制:在某些平台上,多进程的性能可能优于多线程;而在其他平台上,则可能相反。因此,在选择时还需要考虑平台的限制和特性。

二、Python多线程

Python中的多线程主要用于提高程序的并发性,特别是在处理I/O密集型任务时。然而,由于Python的全局解释器锁(GIL)的存在,多线程在CPU密集型任务中并不能显著提高性能。以下是对Python多线程的一些关键点的总结:

1. 线程的基本概念

  • 线程是进程内的一个执行单元,也是进程内的可调度实体。
  • 线程共享进程的地址空间,包括全局变量和堆内存,但每个线程有自己的栈空间和局部变量。
  • 线程是处理器调度的基本单位,但进程不是。

2. 线程的创建与管理

  • Python提供了threading模块来创建和管理线程。
  • 可以通过继承threading.Thread类来创建线程,也可以直接使用threading.Thread来创建线程对象。
  • 线程可以通过调用start()方法来启动,通过join()方法来等待线程结束。

3. 线程同步

  • 由于线程共享进程的内存空间,因此在访问共享资源时需要进行同步,以避免数据竞争和死锁。
  • Python提供了多种同步原语,如锁(Lock)、条件变量(Condition)、事件(Event)等。

4. 线程池

  • 线程池是一种用于管理和复用线程的机制,可以减少线程创建和销毁的开销。
  • Python的concurrent.futures 模块提供了ThreadPoolExecutor类来实现线程池。

5. 多线程的适用场景

  • 多线程最适合用于I/O密集型任务,如网络通信、文件读写、图形用户界面等。
  • 对于CPU密集型任务,由于GIL的存在,多线程并不能显著提高性能,此时可以考虑使用多进程。

6. GIL的影响

  • GIL是Python解释器中的一个互斥锁,它确保任何时候只有一个线程在执行Python字节码。
  • GIL的存在使得Python的多线程在CPU密集型任务中无法实现真正的并行,但在I/O密集型任务中仍然有效。

三、Python多线程优化技巧

Python中的多线程编程可以显著提高程序的响应速度和性能,尤其是在处理I/O密集型任务时。然而,由于全局解释器锁(GIL)的存在,多线程在CPU密集型任务中的性能提升有限。为了最大化多线程的性能,可以采用以下优化技巧:

1. 合理的线程数量

  • 线程数量:过多的线程会增加上下文切换的开销,反而降低性能。通常建议线程数量与CPU核心数相匹配,或者根据具体任务的需求进行调整。
  • 线程池:使用concurrent.futures.ThreadPoolExecutor 来管理线程池,可以有效地控制线程的数量和生命周期。

2. 避免全局解释器锁(GIL)

  • GIL的影响:GIL限制了多线程并行执行Python代码的能力。对于CPU密集型任务,可以考虑使用多进程或者结合C扩展等方式来绕过GIL的限制。
  • 替代方案:对于I/O密集型任务,可以使用异步I/O(如asyncio)来提高性能,而不依赖多线程。

3. 数据共享与同步

  • 锁的使用:使用threading.Lock来保护共享资源,避免竞态条件。但要注意锁的粒度,避免过度锁定导致性能下降。
  • 其他同步原语:根据需要使用条件变量(Condition)、事件(Event)等其他同步原语来实现更复杂的线程同步。

4. 优化线程任务

  • 任务分解:将大任务分解成小任务,可以提高线程的响应速度和整体性能。
  • 任务调度:使用优先级队列(如queue.PriorityQueue)来调度任务,可以提高线程的执行效率。

5. 使用高效的库和工具

  • 第三方库:有些第三方库(如numbacython)可以提高多线程程序的性能,尤其是在数值计算等场景下。
  • 性能分析工具:使用性能分析工具(如cProfilepy-spy)来识别性能瓶颈,进行有针对性的优化。

 四、Python多线程编程入门教程

在Python中,可以使用threading模块来创建和管理线程。以下是创建线程的基本步骤:

  1. 导入threading模块。
  2. 定义一个函数,作为线程的执行体。
  3. 创建Thread对象,将函数作为参数传入。
  4. 调用start()方法启动线程。

下面是一个简单的示例代码:

import threading 
import time 
 
def print_numbers():
    for i in range(5):
        print(i)
        time.sleep(1) 
 
# 创建线程 
thread = threading.Thread(target=print_numbers)
 
# 启动线程 
thread.start() 
 
# 等待线程结束 
thread.join() 
 
print("Main thread ends.")

1. 线程同步

由于线程共享进程的资源,因此需要使用同步机制来协调线程的访问,避免出现数据竞争和不一致的问题。Python的threading模块提供了以下同步工具:

  • Lock:互斥锁,用于保护共享资源,确保在一个时间只有一个线程可以访问。
  • RLock:可重入锁,允许同一线程多次获取锁。
  • Condition:条件变量,用于线程间的通知和等待。
  • Semaphore:信号量,控制对共享资源的访问数量。
  • Event:事件对象,用于线程间的事件通知。

以下是一个使用Lock的示例代码:

import threading 
 
lock = threading.Lock()
counter = 0 
 
def increment_counter():
    global counter 
    for _ in range(100000):
        lock.acquire() 
        counter += 1 
        lock.release() 
 
threads = [threading.Thread(target=increment_counter) for _ in range(2)]
 
for thread in threads:
    thread.start() 
 
for thread in threads:
    thread.join() 
 
print(f"Final counter value: {counter}")

2. 结束线程

通常情况下,线程会在执行完其任务后自动结束。但有时候,我们可能需要手动结束线程。在Python中,可以通过设置标志位或使用threading.Event对象来结束线程。以下是一个示例代码:

import threading 
import time 
 
def print_numbers(stop_flag):
    while not stop_flag.is_set(): 
        print("Thread is running...")
        time.sleep(1) 
 
stop_flag = threading.Event()
 
# 创建线程 
thread = threading.Thread(target=print_numbers, args=(stop_flag,))
 
# 启动线程 
thread.start() 
 
# 模拟一段时间后停止线程 
time.sleep(5) 
stop_flag.set()   # 设置标志位,结束线程 
 
# 等待线程结束 
thread.join() 
 
print("Main thread ends.")

3. 线程池

对于需要频繁创建和销毁线程的场景,使用线程池可以提高效率。Python的concurrent.futures 模块提供了ThreadPoolExecutor类,用于创建和管理线程池。以下是一个示例代码:

from concurrent.futures  import ThreadPoolExecutor 
 
def task(n):
    return n * n 
 
# 创建线程池 
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交任务 
    future = executor.submit(task,  5)
    
    # 获取任务结果 
    result = future.result() 
    print(result)

五、Python多进程

Python中的多进程主要用于提高程序的并发性和性能,特别是在处理CPU密集型任务时。通过使用多进程,可以充分利用多核处理器的优势,提高程序的执行效率。以下是对Python多进程的一些关键点的总结:

1. 多进程的基本概念

多进程是一种并行计算方式,是指在一个程序中同时运行多个进程。与多线程不同,多进程可以避免全局解释器锁(GIL)的限制,从而在CPU密集型任务中实现真正的并行。

2. 多进程的创建与管理

Python提供了multiprocessing模块来创建和管理进程。可以通过创建Process对象来启动一个新的进程,并通过调用start()方法来启动进程,通过join()方法来等待进程结束。

3. 进程间通信

由于进程之间不共享内存空间,因此需要使用特定的机制来进行进程间通信。multiprocessing模块提供了多种进程间通信的方式,如队列(Queue)、管道(Pipe)等。

4. 进程池

进程池是一种用于管理和复用进程的机制,可以减少进程创建和销毁的开销。Python的multiprocessing.Pool类提供了创建和管理进程池的功能。

5. 多进程的适用场景

多进程最适合用于CPU密集型任务,如科学计算、数据分析等。对于I/O密集型任务,由于需要频繁进行I/O操作,多线程可能更为合适。

6. 注意事项

在使用Python的多进程时,需要注意以下几个方面:

  • 全局解释锁(GIL):在Python的某些实现中,GIL的存在可能会限制多线程的性能,但对于多进程来说,GIL的影响较小。
  • 进程间通信:不同进程之间的通信需要使用特定的机制,如队列、管道等。
  • 资源共享:多个进程可能会共享一些资源(如文件、网络连接等),需要合理管理和同步对这些资源的访问,以避免竞争条件和资源泄漏。

六、Python多进程优化技巧

在使用Python的多进程时,有一些优化技巧可以帮助你提高程序的性能和效率。以下是一些常见的优化技巧:

1. 使用进程池

进程池是一种用于管理和复用进程的机制,可以减少进程创建和销毁的开销。通过使用multiprocessing.Pool类,可以创建一个进程池,并使用mapapply等方法来分发任务给进程池中的进程。

2. 避免进程间通信

进程间通信通常会带来额外的开销,因此在设计多进程程序时,应尽量避免进程之间的通信。如果确实需要进行进程间通信,可以使用multiprocessing.Queuemultiprocessing.Pipe等提供的通信机制。

3. 合理划分任务

在使用多进程时,应尽量将任务划分为独立的子任务,以便可以并行执行。这样可以充分利用多核处理器的优势,提高程序的执行效率。

4. 避免全局变量

在多进程程序中,应尽量避免使用全局变量,因为全局变量可能会导致进程之间的数据共享问题,从而影响程序的正确性和性能。

5. 使用合适的进程数量

在使用多进程时,应根据系统的硬件配置和任务的特点来选择合适的进程数量。一般来说,进程数量应与CPU核心数相匹配,以充分利用CPU的并行计算能力。

6. 使用性能分析工具

在优化多进程程序时,可以使用性能分析工具来帮助你找出程序中的性能瓶颈。Python提供了内置的cProfile模块,可以用来分析程序的性能。

七、Python多进程编程入门教程

Python中的多进程编程是一种并行计算方式,可以提高程序的并发性和性能。以下是一个简单的Python多进程编程入门教程:

1. 安装Python

首先,确保你已经在你的电脑上安装了Python。如果没有,可以从Python官方网站下载并安装。

2. 导入必要的模块

在Python中,可以使用multiprocessing模块来创建和管理进程。在开始编写代码之前,需要导入这个模块。

import multiprocessing 

3. 创建进程

可以通过创建Process对象来启动一个新的进程。Process类的构造函数接受一个target参数,指定进程的执行函数。

def my_function():
    print("Hello, world!")
 
if __name__ == "__main__":
    process = multiprocessing.Process(target=my_function)
    process.start() 
    process.join() 

在这个例子中,我们创建了一个新的进程,执行函数为my_function。然后,我们调用start()方法来启动进程,并使用join()方法来等待进程结束。

4. 进程间通信

由于进程之间不共享内存空间,因此需要使用特定的机制来进行进程间通信。multiprocessing模块提供了多种进程间通信的方式,如队列(Queue)、管道(Pipe)等。

def producer(queue):
    for i in range(10):
        queue.put(i) 
 
def consumer(queue):
    while True:
        item = queue.get() 
        if item is None:
            break 
        print(item)
 
if __name__ == "__main__":
    queue = multiprocessing.Queue()
    process1 = multiprocessing.Process(target=producer, args=(queue,))
    process2 = multiprocessing.Process(target=consumer, args=(queue,))
    process1.start() 
    process2.start() 
    process1.join() 
    queue.put(None) 
    process2.join() 

在这个例子中,我们创建了一个队列,并在两个进程之间传输数据。生产者进程将数据放入队列,消费者进程从队列中取出数据并打印出来。

5. 使用进程池

进程池是一种用于管理和复用进程的机制,可以减少进程创建和销毁的开销。通过使用multiprocessing.Pool类,可以创建一个进程池,并使用mapapply等方法来分发任务给进程池中的进程。

def my_function(x):
    return x * x 
 
if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=4)
    results = pool.map(my_function,  [1, 2, 3, 4])
    print(results)

在这个例子中,我们创建了一个进程池,指定了4个进程。然后,我们使用map方法来分发任务给进程池中的进程,并收集结果。

 八、如何监控多线程和多进程

在Python中,监控多线程和多进程可以帮助你了解程序的运行状态和性能。以下是一些常见的方法来监控多线程和多进程:

1、监控多线程

  1. 使用线程的join()方法:通过使用join()方法,可以等待线程结束,并检查线程的执行结果。
import threading 
 
def my_function():
    # 执行一些任务 
    pass 
 
if __name__ == "__main__":
    thread = threading.Thread(target=my_function)
    thread.start() 
    thread.join() 
    print("线程已结束")

使用线程的is_alive()方法:通过使用is_alive()方法,可以检查线程是否仍在运行。

import threading 
 
def my_function():
    # 执行一些任务 
    pass 
 
if __name__ == "__main__":
    thread = threading.Thread(target=my_function)
    thread.start() 
    while thread.is_alive(): 
        print("线程正在运行")
        time.sleep(1) 
    print("线程已结束")

使用线程的daemon属性:通过设置线程的daemon属性为True,可以使线程成为守护线程,这样当主线程结束后,守护线程会自动退出。

import threading 
 
def my_function():
    # 执行一些任务 
    pass 
 
if __name__ == "__main__":
    thread = threading.Thread(target=my_function)
    thread.daemon  = True 
    thread.start() 
    # 主线程结束后,守护线程会自动退出 

2、监控多进程

  1. 使用进程的join()方法:通过使用join()方法,可以等待进程结束,并检查进程的执行结果。
    import multiprocessing 
     
    def my_function():
        # 执行一些任务 
        pass 
     
    if __name__ == "__main__":
        process = multiprocessing.Process(target=my_function)
        process.start() 
        process.join() 
        print("进程已结束")

    使用进程的is_alive()方法:通过使用is_alive()方法,可以检查进程是否仍在运行。

    import multiprocessing 
     
    def my_function():
        # 执行一些任务 
        pass 
     
    if __name__ == "__main__":
        process = multiprocessing.Process(target=my_function)
        process.start() 
        while process.is_alive(): 
            print("进程正在运行")
            time.sleep(1) 
        print("进程已结束")

    使用进程的exitcode属性:通过检查进程的exitcode属性,可以获取进程的退出码,从而判断进程是否正常结束。

    import multiprocessing 
     
    def my_function():
        # 执行一些任务 
        pass 
     
    if __name__ == "__main__":
        process = multiprocessing.Process(target=my_function)
        process.start() 
        process.join() 
        if process.exitcode  == 0:
            print("进程正常结束")
        else:
            print("进程异常结束")

    这些方法可以帮助你监控多线程和多进程的运行状态,从而更好地管理和优化你的程序。

 未完待续~~~!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++多继承:一个子类继承多个父类的情况

C的类继承大家还算比较了解。它主要包括单继承、多继承、虚继承这几方面。 单继承就是一个子类只继承一个父类,多继承就是一个子类继承多个父类。 其实在C中,一个子类继承多个父类的情况还是比较常见的。比如,一个子类需要同时继承两个父类…

在windows电脑上安装docker服务

以下是在 Windows 电脑上安装 Docker 服务的详细步骤: 一、下载 Docker Desktop for Windows 系统要求:Windows 操作系统需要是 Windows 10(64 位)专业版、企业版或教育版,或者是 Windows 11。并且系统要开启了硬件虚…

单片机UART协议相关知识

概念 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器) 是一种 异步 串行 全双工 通信协议,用于设备一对一进行数据传输,只需要两根线(TX,RX)。 异步&…

XXL-JOB执行任务的SpringBoot程序无法注册到调度中心

文章目录 1. 问题呈现2. 问题产生的原因2.1 原因一:执行器和调度中心部署在不同的机器上2.2 原因二:调度中心部署在云服务器上 3. 解决方法3.1 方法一:将执行器和调度中心部署在同一台机器上3.2 方法二:手动指定执行器的ip地址&am…

Ettus USRP X410

总线连接器: 以太网 RF频率范围: 1 MHz 至 7.2 GHz GPSDO: 是 输出通道数量: 4 RF收发仪瞬时带宽: 400 MHz 输入通道数量: 4 FPGA: Zynq US RFSoC (ZU28DR) 1 MHz to 7.2 GHz,400 MHz带宽,GPS驯服OCXO,USRP软件无线电设备 Ettus USRP X410集…

哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性

文章目录 哋它亢SEO技术分析:如何提升网站在搜索引擎中的可见性网站的基本情况SEO优化分析与建议1. 元数据优化2. 关键词优化3. URL结构4. 图像优化5. 移动端优化6. 网站速度7. 结构化数据(Schema Markup)8. 内链与外链9. 社交分享 哋它亢SEO…

将网站地址改成https地址需要哪些材料

HTTPS(安全超文本传输协议)是HTTP协议的扩展。它大大降低了个人数据(用户名、密码、银行卡号等)被拦截的风险,还有助于防止加载网站时的内容替换,包括广告替换。 在发送数据之前,信息会使用SSL…

mongodb多表查询,五个表查询

需求是这样的,而数据是从mysql导入进来的,由于mysql不支持数组类型的数据,所以有很多关联表。药剂里找药物,需要药剂与药物的关联表,然后再找药物表。从药物表里再找药物与成分关联表,最后再找成分表。 这里…

端到端的专线管理与运维:实时掌握专线的运行状态

在当今高度信息化的时代,专线服务已成为企业数据传输的重要组成部分。为了确保专线服务的高效、稳定运行,我们采用了先进的端到端管理模式,对专线的运行状态和质量进行全面监控。本文将从专线管理的必要性、端到端管理模式的优势、实施步骤以…

SpringBoot(8)-任务

目录 一、异步任务 二、定时任务 三、邮件任务 一、异步任务 使用场景:后端发送邮件需要时间,前端若响应不动会导致体验感不佳,一般会采用多线程的方式去处理这些任务,但每次都需要自己去手动编写多线程来实现 1、编写servic…

PostgreSQL常用字符串函数与示例说明

文章目录 coalesce字符串位置(position strpos)字符串长度与大小写转换去掉空格(trim ltrim rtrim)字符串连接(concat)字符串替换简单替换(replace)替换指定位置长度(overlay)正则替换(regexp_replace) 字符串匹配字符串拆分split_part(拆分数组取指定位置的值)string_to_array…

深入剖析Java内存管理:机制、优化与最佳实践

🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 深入剖析Java内存管理:机制、优化与最佳实践 一、Java内存模型概述 1. Java内存模型的定义与作…

【论文速读】| RobustKV:通过键值对驱逐防御大语言模型免受越狱攻击

基本信息 原文标题:ROBUSTKV: DEFENDING LARGE LANGUAGE MODELS AGAINST JAILBREAK ATTACKS VIA KV EVICTION 原文作者:Tanqiu Jiang, Zian Wang, Jiacheng Liang, Changjiang Li, Yuhui Wang, Ting Wang 作者单位:Stony Brook University…

css使用弹性盒,让每个子元素平均等分父元素的4/1大小

css使用弹性盒,让每个子元素平均等分父元素的4/1大小 原本: ul {padding: 0;width: 100%;background-color: rgb(74, 80, 62);display: flex;justify-content: space-between;flex-wrap: wrap;li {/* 每个占4/1 */overflow: hidden;background-color: r…

图像处理 之 凸包和最小外围轮廓生成

“ 最小包围轮廓之美” 一起来欣赏图形之美~ 1.原始图片 男人牵着机器狗 2.轮廓提取 轮廓提取 3.最小包围轮廓 最小包围轮廓 4.凸包 凸包 5.凸包和最小包围轮廓的合照 凸包和最小包围轮廓的合照 上述图片中凸包、最小外围轮廓效果为作者实现算法生成。 图形几何之美系列&#…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

【论文阅读】Poison Forensics: Traceback of Data Poisoning Attacks in Neural Networks

Poison Forensics: Traceback of Data Poisoning Attacks in Neural Networks 核心原理前提条件方法第一个问题第二个问题 核心原理 有毒样本会使模型更接近参数空间中的最佳位置,良性样本会使该模型向其随机初始化状态移动 前提条件 最重要的: 可以…

递归算法专题一>反转链表

题目: 解析: 也可以把链表看作一棵树,后续遍历这棵树然后和上图一样,改变指针即可 代码: public ListNode reverseList(ListNode head) {if(head null || head.next null) return head;ListNode newHead revers…

拼音。。。。。。。。。。

拼音。文心一言、文心大模型3.5,竟然说错了,如下图。所以,以后都不想在文心一言搜拼音了。。以后搜拼音,还是在百度一下直接搜,搜到的顶头第一条也是AI智能回答,可能比文心一言更加好更加准 正确的说法是&…

K8S资源限制之LimitRange

LimitRange介绍 LimitRange也是一种资源,在名称空间内有效;限制同一个名称空间下pod容器的申请资源的最大值,最小值pod的resources中requests和limits必须在这个范围内,否则pod无法创建。当然pod也可以不使用resources进行创建ty…