千家信息网

如何使用多线程加速Python代码

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍如何使用多线程加速Python代码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!很多时候,我们大部分使用Python编写代码,python因为其简洁,在一些小功
千家信息网最后更新 2024年11月23日如何使用多线程加速Python代码

这篇文章主要介绍如何使用多线程加速Python代码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

很多时候,我们大部分使用Python编写代码,python因为其简洁,在一些小功能的开发确实快一些,当我们的代码执行远程请求或读取多个文件或对某些数据进行处理。在很多情况下下,我们大家都是利用循环去读取,这种方法要花很长时间才能完成执行。

import requests
from time import time

url_list = [
"https://via.placeholder.com/400",
"https://via.placeholder.com/410",
"https://via.placeholder.com/420",
"https://via.placeholder.com/430",
"https://via.placeholder.com/440",
"https://via.placeholder.com/450",
"https://via.placeholder.com/460",
"https://via.placeholder.com/470",
"https://via.placeholder.com/480",
"https://via.placeholder.com/490",
"https://via.placeholder.com/500",
"https://via.placeholder.com/510",
"https://via.placeholder.com/520",
"https://via.placeholder.com/530",
]

def download_file(url):
html = requests.get(url, stream=True)
return html.status_code

start = time()

for url in url_list:
print(download_file(url))

print(f'Time taken: {time() - start}')

输出:

Time taken: 4.128157138824463

这是很明显的案例,这段代码将依次打开每个URL,等待其加载,打印其状态代码,然后再移至下一个URL。如果用上面的写法将十分耗时,这种代码非常适合用于多线程。

利用多线程,您可以以非常低的开销同时执行多个任务。接下来我们去试一下。

我们使用 current.futures 库的ThreadPoolExecutor实现多线程。然后我们写一下多线程代码,并解释原理。

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from time import time

url_list = [
"https://via.placeholder.com/400",
"https://via.placeholder.com/410",
"https://via.placeholder.com/420",
"https://via.placeholder.com/430",
"https://via.placeholder.com/440",
"https://via.placeholder.com/450",
"https://via.placeholder.com/460",
"https://via.placeholder.com/470",
"https://via.placeholder.com/480",
"https://via.placeholder.com/490",
"https://via.placeholder.com/500",
"https://via.placeholder.com/510",
"https://via.placeholder.com/520",
"https://via.placeholder.com/530",
]

def download_file(url):
html = requests.get(url, stream=True)
return html.status_code

start = time()

processes = []
with ThreadPoolExecutor(max_workers=10) as executor:
for url in url_list:
processes.append(executor.submit(download_file, url))

for task in as_completed(processes):
print(task.result())


print(f'Time taken: {time() - start}')

输出:

Time taken: 0.4583399295806885

代码处理速度增加了9倍!如果有更多的URL,则性能差异应该更明显。

为什么多线程速度那么快。当我们在调用executor.submit时,我们往线程池添加一个新的任务。

那到底是怎么回事?调用时,executor.submit我们正在向线程池添加新任务。连接其存储起来,之后我们将便利调用任务,并打印结果。

as_completed方法是用来在一个任务完成后,立即从任务列表拿出一个任务去执行。只有已经执行完成或者被取消,任务才会标记为完成状态。我们也可以向其传递一个超时参数,如果任务花费的时间超过该时间段,则即使也会as_completed切换任务。

以上是"如何使用多线程加速Python代码"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

任务 代码 线程 明显 内容 多个 方法 时间 更多 状态 篇文章 速度 处理 输出 简洁 接下来 价值 会标 兴趣 写法 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 古冶区软件开发项目 线下数据库设计 渝北区提供软件开发服务常见问题 网络安全性开放是啥意思 wlan重置后无法连接到服务器 SETI计划软件开发 怎么样获取服务器管理权限 常见的网络安全基础问题 苹果的智能服务器叫什么名字 北大网络安全实验室 科技兴农互联网加 三个表格数据库怎么做 国家网络安全产业园二期项目 vb数据库表查询作为as 社区开展网络安全周小结 浪潮服务器硬盘换完灯什么样 贵州网络安全培养基地 与ntp服务器之间的误差 明日之后有狼袭的服务器在哪里 我与网络安全主题黑板报 php中查询数据库 哪款服务器cpu玩游戏好 怎样提升网络安全知识 网络安全 书法作品 网页显示应用显示的服务器错误 如何撤销数据库表操作吗 关于网络安全教育的手抄报文字 一个软件开发的时间 北京云桌面服务器哪家好 深圳富利邦互联网科技有限公司
0