
简介
在当今快节奏的数字环境中,对于开发人员和数据科学家来说,有效完成计算困难的任务至关重要。幸运的是,由于其适应性和广泛的生态系统,Python提供了强大的并行处理能力。我们可以通过将困难的问题分解为更小、更易管理的活动,并同时进行处理,从而获得大幅度的性能提升。
Python 的并行处理功能使我们能够利用可用的计算机资源更快、更有效地进行网页抓取、科学模拟和数据分析等活动。在这篇文章中,我们将通过 Python 并行处理开始一段旅程。我们将研究许多方法,包括多处理、异步编程和多线程,并学习如何有效地使用它们来绕过系统中的性能障碍。加入我们,让我们认识到 Python 并行处理的全部威力,并达到性能和生产力的新高度。
了解并行处理
将作业拆分为较小的子任务并在多个处理器或内核上同时运行它们称为并行处理。并行处理可以通过有效地利用可用的计算资源来显着减少程序的总执行时间。异步编程、多处理和多线程只是 Python 提供的几种并行处理方法。
Python 中的多线程
使用多线程的方法,许多线程在同一个进程内同时运行,共享同一块内存。可以使用Python的threading模块很容易地实现多线程。然而,在Python中使用多线程可能不会对CPU密集型操作产生加速效果,因为全局解释器锁(GIL)只允许一个线程同时执行Python字节码。然而,多线程对于I/O密集型任务可能很有用,因为它允许线程在等待I/O操作完成时运行其他操作。
立即学习“Python免费学习笔记(深入)”;
让我们看一个使用多线程下载多个网页的示例:
示例
import threading import requests
def download_page(url):
response = requests.get(url)
print(f"Downloaded {url}")
urls = [
"https://example.com",
"https://google.com",
"https://openai.com"
]
threads = []
for url in
urls:
thread = threading.Thread(target=download_page,
args=(url,)) thread.start() threads.append(thread)
for thread in threads:
thread.join()
输出
Downloaded https://example.com Downloaded https://google.com Downloaded https://openai.com
由于上面的代码片段可以同时进行多个下载,该代码片段在其自己的线程中下载每个 URL。 join() 函数确保主线程等待每个线程完成后再继续。
Python 中的多重处理
多进程与多线程相对应,通过使用多个进程,每个进程都有自己的内存空间,提供了真正的并行性。Python的multiprocessing模块提供了一个高级接口来实现多进程。多进程适用于CPU密集型任务,因为每个进程在独立的Python解释器中运行,避免了GIL多线程限制。
在下面的代码中使用了多进程。一旦池类生成了一组工作进程,map()方法会将负担分配给可用的进程。结果列表是结果的集合。
考虑下面的例子,在这个例子中,我们使用多进程来计算列表中每个整数的平方:
示例
import multiprocessing
def square(number):
return number ** 2
numbers = [1, 2, 3, 4, 5]
with multiprocessing.Pool() as pool:
results = pool.map(square, numbers)
print(results)
输出
[1, 4, 9, 16, 25]
Python 异步编程
通过利用非阻塞操作,异步编程实现了I/O密集型进程的高效执行。由于有了asyncio包,Python可以使用协程、事件循环和futures来创建异步代码。随着在线应用和API的流行,异步编程变得越来越重要。
下面的代码示例中的fetch_page()协程利用aiohttp来异步获取网页。main()方法生成一个作业列表,然后使用asyncio.gather()同时执行这些作业。要等待任务完成并接收结果,请使用await关键字。
让我们看一个使用asyncio和aiohttp异步获取多个网页的示例:
示例
import asyncio
import aiohttp
async def fetch_page(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response:
return await response.text()
async def main():
urls = [
"https://example.com",
"https://google.com",
"https://openai.com"
]
tasks = [fetch_page(url) for url in urls] pages = await asyncio.gather(*tasks)
print(pages)
asyncio.run(main())
输出
['\n\n\nExample Domain \n\n \n \n \n \n\n\n\n\n\n\n', 'Example Domain
\nThis domain is for use in illustrative examples in documents. You may use this\n domain in literature without prior coordination or asking for permission.
\n \n










