Python 爬阶梯 | 协程在手,说走就走

今天咱们来学习如何通过 Python 来使用协程,我们之前说过,协程也是一种实现并发的手段,它的一个主要的特点就是,异步任务的调度可以由我们自己决定。

在 Python3.7 中,提供了 asyncio 模块,使用它可以来实现一个协程的程序。

别懵逼,咱们用代码说话,就会容易理解一些了。

先来看看这么一个简单的代码:

在这里我们定义了一个 main 方法,每隔一秒钟就打印一句话,然后记录一下执行的时间:

接下来我们给这段代码加上协程:

本文隐藏内容 登陆 后才可以浏览
结果很明显,1秒就搞定了。值得注意的是,这里的 “帅b老仙” 是在你 main 函数的 await asyncio.sleep(1) 之前,所以每一个任务执行到这里的时候,遇到 await 就会的当前任务就会跳出,开始调度下一个任务, 1 秒钟过后,事件调度器就会重新调度一开始的任务,往下执行 “法力无边”。

通过协程的方式,可以有效的去高效的执行并发任务,通过 asyncio 模块的 await 和 create_task 方式来有效控制任务的切换。

以上就是 Python 中使用协程的方式,这里演示用到的 asyncio 新方法,需要你升级到 3.7 以上的版本才能使用。

那么现在的你,是否可以通过协程的方式,改写我们上次说到的高效爬取豆瓣 TOP250 电影?

5 Replies to “Python 爬阶梯 | 协程在手,说走就走”

  1. superhandsomeB说道:

    帅b 我把main 函数里面这句话注释掉了 #await asyncio.sleep(1)
    执行的时间就是整体时间减去一秒咯

  2. rlysyy说道:

    await中的sleep时间要如何估算呢
    我的理解是比如要执行一个IO操作,就在IO之后设置一个sleep时间,把原本的等待时间用来去干其他事情,但是这段等待时间如何估算不是很清楚

    1. 小帅b说道:

      这里的 sleep 只是我给你们做的一个演示,并不是协程的重点。实际情况下要根据自己的业务代码而定哦,当你调用 create_task 的时候,实际上已经开始异步操作了。

  3. Hua Don说道:

    b哥,用协程的是比多线程慢挺多么,协程的用了1秒多。多线程才0.几秒

    1. 小帅b说道:

      恩,顺便补充一下,协程有些人也叫作微线程,也就是说它本质上还是一个单线程,不过它可以让我们自己使用异步调度,这样花在 IO 等待的时间我们可以让它去做别的事情,从而提高效率,不过它是在线程里面切换的,不同于多线程多进程是作用于 CPU 的,资源越牛逼消耗的越多,就会越快!

回复 Hua Don 取消回复