一、Python 线程池模块简介
Python 中的 concurrent.futures
模块提供了 ThreadPoolExecutor
和 ProcessPoolExecutor
两个类,用于管理一个线程池和一个进程池。本文重点讲解 ThreadPoolExecutor
类,即用于多线程操作的线程池模块。
线程池中包含多个并发执行的线程,当有任务需要处理时,会从线程池中获取一个线程来处理任务。这种方式可以减少线程创建、销毁的开销,同时也可以避免线程数量过多导致系统资源耗尽的情况。线程池模块的优点是提高了数据处理的效率,减少了系统资源的浪费。
二、线程池的实现
Python 中的 concurrent.futures
模块提供了一个 ThreadPoolExecutor
类,用于实现线程池。具体实现过程如下:
- 导入模块
import concurrent.futures
- 创建线程池
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
# tasks
以上代码创建了一个具有 5 个工作线程的线程池。
- 提交任务
任务可以通过 submit()
函数提交,接受一个函数作为参数。
def func():
# task
future = executor.submit(func)
以上代码表示将 func
函数提交到线程池中。
- 获取任务结果
使用 result()
函数获取任务的结果。
print(future.result())
- 关闭线程池
完成所有任务后,需要关闭线程池。使用 shutdown()
函数即可。
executor.shutdown()
三、示例说明
- 线程池求和
import concurrent.futures
def sum(n):
s = 0
for i in range(1, n+1):
s += i
return s
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = []
for i in range(1, 11):
future = executor.submit(sum, i*100)
futures.append(future)
for future in concurrent.futures.as_completed(futures):
print(future.result())
以上代码使用线程池计算了 1~1000 的和,并输出了每个任务的结果。
- 线程池下载文件
import urllib.request
import concurrent.futures
def download_file(url, filename):
urllib.request.urlretrieve(url, filename)
print(f"{filename} 下载完成")
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
urls = ["https://www.example.com/1.jpg", "https://www.example.com/2.jpg", "https://www.example.com/3.jpg"]
filenames = ["1.jpg", "2.jpg", "3.jpg"]
futures = []
for url, filename in zip(urls, filenames):
future = executor.submit(download_file, url, filename)
futures.append(future)
for future in concurrent.futures.as_completed(futures):
pass
以上代码使用线程池同时下载多个文件,并在下载完成后输出文件名。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 线程池模块之多线程操作代码 - Python技术站