Python多线程的使用 multiprocessing.dummy, 单线程+异步协程
高性能异步爬虫
目的:在爬虫中使用异步实现高性能的数据爬取操作。
异步爬虫的方式:
1.多线程,多进程(不建议)
- 好处:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。
- 弊端:无法无限制的开启多线程或者多进程。
2.线程池、进程池(适当的使用) :
- 好处:我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统的开销
- 弊端:池中线程或进程的数量是有上限。
import time
from multiprocessing.dummy import Pool
def get(url):
print('开始下载:',url)
time.sleep(2)
print('====完成下载:',url)
return url
'''#单线程-耗时成任务成正比
urls=['aa.com','bb.com','cc.com','dd.com','ee.com','ff.com','gg.com','hh.com']
start_time=time.time()
for url in urls:
get(url)
end_time=time.time()
print(end_time-start_time) #共要16秒
'''
#多线程-线程池成倍缩小耗时操作
urls=['aa.com','bb.com','cc.com','dd.com','ee.com','ff.com','gg.com','hh.com']
start_time=time.time()
pool=Pool(8) #同时运行进程数,默认不写则等于当前电脑cpu数
res=pool.map(get,urls)
pool.close()
pool.join()
print(res)
end_time=time.time()
print(end_time-start_time) #同样任务只需16/8=2秒
3.单线程+异步协程(推荐):
- event_ Loop: 事件循环,相当于一个无限循环, 我们可以把一些函数注册到这个事件循环上,
当满足某些条件的时候,函数就会被循环执行。 - coroutine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用async关键字来定义一个方法, 这个方法在调用时不会 立即被执行,而是返回一个协程对象。
- task:任务,它是对协程对象的进一步封装, 包含了任务的各个状态。
- future:代表将来执行或还没有执行的任务,实际上和task 没有本质区别。
- async定义一个协程.
- await用来挂起阻塞方法的执行。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现