爬虫为什么使用asyncio以及邮件系统为什么使用celery

#--------------------------------下面是asyncio-------------------------------------------

[1]中有一句非常好:

爬虫主要运行时间消耗是请求网页时的io阻塞

假设爬取10个网页,每个网页的响应时间是300ms,那么同步爬取耗时就是3s,

使用asyncio,在网页响应的300ms内,去发起另外一个爬取动作,这样,网页一边响应,爬虫客户端就可以一边做别的事情了。

等待的事情,甩锅给网页的服务器,爬虫继续发起下一轮爬取动作

#--------------------------------下面是celery-------------------------------------------

django用来实现邮件系统常用celery,

celery是个异步队列,输入和输出处理的速度可以不一致,

django页面告诉客户邮件已经发送,其实发送邮件的动作只是托管给了celery,并不是真的已经发送到你邮箱了。

所以发送邮件的是smtp服务器,并不是django

但是如果几百上千客户注册,需要邮件激活, 设计成同步的话,那就存在最糟糕情况,有的客户要等几十分钟才能被发送注册邮件。

那么怎么办呢?

django把这几千个帐号激活的邮件托管给celery,celery发给smtp,smtp有成千上万台服务器,smtp从celery串行接收到发送邮件的任务后,通过负载均衡,分派不同的smtp子服务器发送给客户的注册邮箱,大大提升响应。

等待的事情,甩锅给celery和smtp服务器,邮件系统继续发起下一轮发送注册激活邮件的动作。

#---------------------------------------------------------------------------

celery和asyncio能不能互换使用?

不能,使用celery时候,不需要等待结果(例如邮件系统)

而使用asyncio的时候,往往需要等待结果,最终结果需要传给你设计的接口(例如爬虫)

根据[2]

if its something that shouldn't be done if the connection is aborted, or service unavailable, then go ahead and use a async task.(如果链接断开希望任务不再执行,那么我们需要使用的就是asyncio而不是celery)

另外注意,并行是时刻存在的,取指就是并行.但是绝对并行是不存在的

#---------------------------------------------------------------------------

异步的关键就是:

怎么甩锅,让自己的服务器更加轻松。

Reference:

[1]多线程爬虫实现(上)

[2]Can we use python asyncio in place of celery?

发布了785 篇原创文章 · 获赞 357 · 访问量 166万+

猜你喜欢

转载自blog.csdn.net/appleyuchi/article/details/105070781