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.单线程+异步协程(推荐):

  1. event_ Loop: 事件循环,相当于一个无限循环, 我们可以把一些函数注册到这个事件循环上,
    当满足某些条件的时候,函数就会被循环执行。
  2. coroutine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用async关键字来定义一个方法, 这个方法在调用时不会 立即被执行,而是返回一个协程对象。
  3. task:任务,它是对协程对象的进一步封装, 包含了任务的各个状态。
  4. future:代表将来执行或还没有执行的任务,实际上和task 没有本质区别。
  5. async定义一个协程.
  6. await用来挂起阻塞方法的执行。
posted @   晨光曦微  阅读(250)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示