• 周二. 2月 7th, 2023

Python 并发编程技术详解

城主

12月 29, 2022 ,

Python 在执行时采用了解释器执行模式,这意味着 Python 程序只能在一个时刻执行一个任务。但是,你可以使用 Python 的并发编程功能来同时执行多个任务。

Python 提供了许多用于并发编程的库和工具,其中包括:

  • threading 模块:提供了一种基本的线程编程接口。
  • multiprocessing 模块:提供了一种基本的多进程编程接口。
  • concurrent.futures 模块:提供了一种通用的并发编程接口,可以使用线程或进程实现。

下面是一个使用 threading 模块创建线程的简单示例:





import threading

def run_thread(n):
    print(f"Thread {n}: started")
    # do some work here
    print(f"Thread {n}: finished")

# create and start two threads
thread1 = threading.Thread(target=run_thread, args=(1,))
thread2 = threading.Thread(target=run_thread, args=(2,))
thread1.start()
thread2.start()

# wait for threads to complete
thread1.join()
thread2.join()

print("All threads have finished.")

上面的程序将会创建两个线程,并同时执行它们。然后,它会等待两个线程完成,最后输出 “All threads have finished.”。

注意,线程是用来执行轻量级任务的,而不是用来执行 CPU 密集型任务的。如果你想要执行 CPU 密集型任务,你应该使用多进程来实现并发编程。多进程是一种将程序分解成多个执行单元的方法,每个执行单元(即进程)都是一个独立的程序,可以独立运行。

下面是一个使用 multiprocessing 模块创建多进程的简单示例:





import multiprocessing

def run_process(n):
    print(f"Process {n}: started")
    # do some work here
    print(f"Process {n}: finished")

# create and start two processes
process1 = multiprocessing.Process(target=run_process, args=(1,))
process2 = iprocessing.Process(target=run_process, args=(2,))
process1.start()
process2.start()

# wait for processes to complete
process1.join()
process2.join()

print("All processes have finished.")

上面的程序将会创建两个进程,并同时执行它们。然后,它会等待两个进程完成,最后输出 “All processes have finished.”。

阅读  Python 构建系统

多进程是有利于执行 CPU 密集型任务的,因为它们可以利用多核 CPU 的多个内核同时工作。

当然,你也可以使用 concurrent.futures 模块来实现并发编程。它提供了一个通用的接口,可以使用线程或进程实现。这使得你可以在不改变程序代码的情况下,根据需要选择使用线程或进程实现并发编程。

例如,下面是使用 concurrent.futures 模块创建多进程的简单示例:

import concurrent.futures

def run_task(n):
    print(f"Task {n}: started")
    # do some work here
    print(f"Task {n}: finished")

# create a ProcessPoolExecutor with 4 worker processes
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
    # submit two tasks
    task1 = executor.submit(run_task, 1)
    task2 = executor.submit(run_task, 2)

print("All tasks have been completed.")

上面的程序将会创建一个包含 4 个工作进程的进程池执行器,并使用它来提交两个任务。然后,它会等待两个任务完成,最后输出 “All tasks have been completed.”。

你也可以使用 concurrent.futures 模块创建线程,只需将 ProcessPoolExecutor 替换为 ThreadPoolExecutor 即可。

并发编程是一项技术,需要谨慎使用。如果不当使用,它可能会导致程序的性能变差、程序结构混乱、以及其他问题。你应该根据你的程序的需要来选择合适的并发编程方式。