You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
$ python sync_crawl
# 输出 crawling url_num 后,等待 num 秒后输出对应的 OK url_num
crawling url_1
OK url_1
crawling url_2
OK url_2
crawling url_3
OK url_3
crawling url_4
OK url_4
Time: 10.012153034
$ python async_crawl
# 立刻输出4个 crawling url_num 后,第1秒后输出 OK url_1,第2秒后输出 OK url_2 ... 第4秒后输出 OK url_4
crawling url_4
crawling url_3
crawling url_2
crawling url_1
OK url_1
OK url_2
OK url_3
OK url_4
Time: 4.00415018
The text was updated successfully, but these errors were encountered:
参考:
一、协程简介
协程使用发展史:
随着互联网的快速发展,你逐渐遇到了 C10K 瓶颈,也就是同时连接到服务器的客户达到了一万个。于是很多代码跑崩了,进程上下文切换占用了大量的资源,线程也顶不住如此巨大的压力,这时, NGINX 带着事件循环出来拯救世界了(在高并发下能保持低资源低消耗高性能):
事件循环启动一个统一的调度器,让调度器来决定一个时刻去运行哪个任务,于是省却了多线程中启动线程、管理线程、同步锁等各种开销。
再到后来,出现了一个很有名的名词,叫做回调地狱 callback hell(JavaScript),这种工具完美地继承了事件循环的优越性,同时还能提供 async / await 语法糖,解决了执行性和可读性共存的难题。于是,协程逐渐被更多人发现并看好,也有越来越多的人尝试用 Node.js (JavaScript 是一门单线程的语言,无法多线程实现并发,但可以使用协程实现并发)做起了后端开发。
使用生成器,是 Python 2 开头的时代实现协程的老方法了,Python 3.7 提供了新的基于 asyncio 和 async / await 的方法。
进程、线程、协程 的上下文切换比较
内核栈
硬件上下文
硬件上下文
协程总结:
进程、线程、协程应用场景
二、协程示例
示例1:同步(不使用协程)爬取4个URL
$ python sync_crawl # 输出 crawling url_num 后,等待 num 秒后输出对应的 OK url_num crawling url_1 OK url_1 crawling url_2 OK url_2 crawling url_3 OK url_3 crawling url_4 OK url_4 Time: 10.012153034
示例2:异步(使用协程)爬取4个URL
$ python async_crawl # 立刻输出4个 crawling url_num 后,第1秒后输出 OK url_1,第2秒后输出 OK url_2 ... 第4秒后输出 OK url_4 crawling url_4 crawling url_3 crawling url_2 crawling url_1 OK url_1 OK url_2 OK url_3 OK url_4 Time: 4.00415018
The text was updated successfully, but these errors were encountered: