#--------------------------------下面是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]多线程爬虫实现(上)