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.”。
多进程是有利于执行 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
即可。
并发编程是一项技术,需要谨慎使用。如果不当使用,它可能会导致程序的性能变差、程序结构混乱、以及其他问题。你应该根据你的程序的需要来选择合适的并发编程方式。