Python中的并发编程:这些技巧让你的程序更加高效! 在现代计算机中,多核CPU已经非常普遍了。然而,大多数Python程序仍然只是使用单线程运行,这会浪费大量的CPU资源。幸运的是,Python提供了几个模块来帮助我们实现并发编程,让程序运行更加高效。 1. 多线程 多线程是最基本的并发编程模型。在Python中,我们可以使用threading模块来创建和管理线程。下面是一个例子,使用多线程来计算一个非常大的整数的阶乘: ```python import threading import math class FactorialThread(threading.Thread): def __init__(self, n): super().__init__() self.n = n def run(self): self.result = math.factorial(self.n) def get_result(self): return self.result threads = [] for i in range(1, 101): t = FactorialThread(i) threads.append(t) t.start() for t in threads: t.join() print("Factorial of %d is %d" % (t.n, t.get_result())) ``` 在这个例子中,我们创建了100个线程来同时计算100个不同整数的阶乘。每个线程都执行run()方法,计算相应整数的阶乘,并将结果存储在实例的result属性中。最后,我们使用get_result()方法来获取每个线程计算的结果。 2. 多进程 与多线程类似,Python中也有一个模块可以帮助我们实现多进程并发编程,这个模块就是multiprocessing。下面是一个例子,使用多进程来计算一个非常大的整数的阶乘: ```python import multiprocessing import math def factorial(n): return math.factorial(n) pool = multiprocessing.Pool() results = [] for i in range(1, 101): result = pool.apply_async(factorial, (i,)) results.append(result) for r in results: r.wait() print("Factorial of %d is %d" % (r.get()[0], r.get()[1])) ``` 在这个例子中,我们使用multiprocessing.Pool()来创建一个进程池。我们使用apply_async()方法向进程池提交任务,这里的任务就是计算相应整数的阶乘。每个任务的结果也是异步获取的,我们可以使用get()方法获取每个任务的结果。 3. 协程 协程是一种轻量级的并发编程模型,它可以将一个程序分为多个微任务,让这些微任务在一个线程内交替执行。Python中的协程模块是asyncio。 下面是一个例子,使用协程来计算一个非常大的整数的阶乘: ```python import asyncio import math async def factorial(n): return math.factorial(n) async def main(): tasks = [] for i in range(1, 101): tasks.append(asyncio.ensure_future(factorial(i))) await asyncio.gather(*tasks) for t in tasks: print("Factorial of %d is %d" % (t.result(), t.result())) loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` 在这个例子中,我们使用asyncio.ensure_future()方法来将每个计算任务包装成协程。我们使用asyncio.gather()来等待所有协程完成。在协程完成后,我们使用t.result()来获取每个协程计算的结果。 总结 在Python中,多线程、多进程和协程都是实现并发编程的有效方法。它们可以帮助我们充分利用多核CPU,并加速程序的运行速度。然而,在实际应用中,我们需要根据程序的特点来选择合适的并发编程模型,以达到最好的性能表现。