Python 中的多线程和多处理
一.介绍
在本文中,我们将探讨 Python 中多线程和多处理的使用。在当今的多核处理器世界中,利用并发编程技术对于优化性能至关重要。Python 提供了两个强大的并行执行模块:用于多线程的线程和用于多处理的多处理。
二.Python 中的多线程
多线程允许多个线程在单个进程内同时运行。它对于 I/O 密集型任务特别有用,因为程序会花费大量时间等待外部操作。我们以使用多线程进行 Web 抓取为例。
示例。让我们创建一个简单的网络抓取工具,它可以同时从多个 URL 下载内容。在运行以下示例之前,您必须使用 pip install request 安装请求包。
import threading
import requests
import time
def download_content(url):
response = requests.get(url)
print(f"Downloaded {len(response.content)} bytes from {url}")
urls = [
"https://www.python.org",
"https://www.github.com",
]
start_time = time.time()
threads = []
for url in urls:
thread = threading.Thread(target=download_content, args=(url,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
end_time = time.time()
print(f"Total execution time: {end_time - start_time:.2f} seconds")
上述 Python 代码为每个 URL 创建一个单独的线程,允许并发下载。 join() 方法确保在程序退出之前所有线程都完成。
三.Python 中的多处理
虽然多线程受到 CPython 中的全局解释器锁 (GIL) 的限制,但多处理可以通过生成单独的 Python 进程来充分利用多个 CPU 核心。让我们以使用多个进程计算素数为例。
示例。让我们使用多个进程来计算素数。
import multiprocessing
import time
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def find_primes(start, end):
return [num for num in range(start, end) if is_prime(num)]
if __name__ == "__main__":
start_time = time.time()
pool = multiprocessing.Pool(processes=4)
ranges = [(1, 25000), (25001, 50000), (50001, 75000), (75001, 100000)]
results = pool.starmap(find_primes, ranges)
all_primes = [prime for sublist in results for prime in sublist]
end_time = time.time()
print(f"Found {len(all_primes)} prime numbers")
print(f"Total execution time: {end_time - start_time:.2f} seconds")
上述 Python 代码使用工作进程池将素数计算分布在多个 CPU 核心上。
四.在多线程和多处理之间进行选择
- 使用多线程执行 I/O 密集型任务(例如,网络操作、文件 I/O)。
- 对于需要并行计算的 CPU 密集型任务,请使用多处理。
- 多线程对系统资源的占用较小,但受到 GIL 的限制。
- 多处理的开销较大,但可以充分利用多个 CPU 核心。
五.概括
多线程和多处理都是提高 Python 应用程序性能的强大工具。通过了解它们的优势和用例,您可以根据自己的特定需求选择正确的方法。
原文地址:https://blog.csdn.net/xiefeng240601/article/details/140653059
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!