如何在Python中合理使用多线程

我在学习Python的多线程编程时,了解到Python的全局解释器锁(GIL)会限制多线程在某些计算密集型任务上的性能提升。

请先 登录 后评论

1 个回答

潇洒剑客

一、理解多线程的适用场景 I/O 密集型任务 当程序主要是在等待外部输入 / 输出(I/O)操作完成时,如读取文件、*请求等,多线程可以显著提高效率。例如,在一个*爬虫程序中,需要从多个网页获取数据。如果使用单线程,程序会依次请求每个网页,等待一个网页的数据完全返回后再请求下一个。但如果使用多线程,可以同时发起多个网页请求,当一个线程在等待某个网页的响应时,其他线程可以继续处理其他网页的请求。 示例代码: 收起

import requests import threading def download_page(url): resp*e = requests.get(url) print(f"Downloaded {url}, status code: {resp*e.status_code}") urls = ["https://www.example1.com", "https://www.example2.com", "https://www.example3.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()

在这个例子中,我们创建了多个线程来并发地下载网页内容。每个线程负责下载一个指定的网页,这样可以大大加快整个下载过程。 不适合 CPU 密集型任务(在 CPython 解释器下) 由于 Python 的全局解释器锁(GIL)的存在,在 CPython(最常用的 Python 解释器)中,多线程在处理 CPU 密集型任务(如复杂的数学计算)时,并不能充分利用多核 CPU 的优势。因为同一时间只有一个线程可以执行 Python 字节码。例如,一个计算斐波那契数列的函数,在多线程环境下运行多个这样的计算任务,并不会比单线程快很多,因为多个线程会竞争 GIL,大部分时间都在等待获取 GIL 来执行代码。 不过,如果是在一些不带有 GIL 的 Python 解释器(如 Jython 或 IronPython)下,多线程对于 CPU 密集型任务可以更好地利用多核 CPU。

二、线程的创建和启动 使用threading模块创建线程 可以通过定义一个函数作为线程要执行的任务,然后使用threading.Thread类来创建线程对象。线程对象的target参数指定要执行的函数,args参数(可选)指定传递给函数的参数。 示例:

import threading def print_numbers(): for i in range(10): print(i) thread = threading.Thread(target=print_numbers) thread.start()



请先 登录 后评论