pythonasyncio在哪个版本好_菜鸟上手Python最有野心的库Asyncio

Asyncio是Python中非常牛逼的一个异步并发库,比较复杂不太好理解!从Py3.4之后开始加入这个内置并发库,一举解决了Python中高并发的问题。它提供了一整套异步IO模型的编程接口,可以说它不是一个简单的库更多的是一个框架!我们很多大名鼎鼎的第三方库比如Tornado,gevent里面都有它的身影,今天我们简单的示例让菜鸟快速上手。

asyncio 使用

1).先定义个协程函数

从Python3.5开始引入了async和await ,方便我们更好的使用asyncio这个库。async就是声明一个函数为协程。而await就是代替原来的yield from。

协程里面是不能有阻塞操作的,对于sleep这样的阻塞我们需要用关键是await来包装一下,可以理解为执行一个sleep的协程,sleep 2秒

协程需要搭配事件循环才能使用,用asyncio库里面的get_event_loop来声明一个异步的事件循环

然后把我们的add函数注册到loop中去

最后我们等待事件完成run_until_complete

2).如何用asyncio执行多个task

上面的函数很明显太简单的,如果完成多个task的并发呢,我们稍微改动几行代码生成一个多任务的相加的函数,简便操作我们用zip构造10组x,y参数

然后把这个10个add函数,也就是10个协程放到一个tasks列表里面

最后塞到事件循环里面,等待它们完成

看一下结果:

Add 2 + 12 ...

Add 6 + 16 ...

Add 3 + 13 ...

Add 7 + 17 ...

Add 1 + 11 ...

Add 8 + 18 ...

Add 9 + 19 ...

Add 4 + 14 ...

Add 5 + 15 ...

cost: 2.0038228034973145

3).如果获取多个并发的task的结果如果我们要获取task的结果,一定要创建一个task, 就是把我们的协程绑定要task上,这里直接用事件循环loop里面的create_task就可以搞定。

我们假设有3个并发的add任务需要处理,然后调用run_until_complete来等待3个并发任务完成。

调用task.result查看结果,这里的task其实是_asyncio.Task,是封装的一个类。

大家可以在Pycharm中找asyncio里面的源码,里面有一个tasks文件.

学完上面的3招我们菜鸟是不是有点懂了,但是还是不会运用,下面我们用一个小的综合案例来玩一下asyncio.

实战并发爬取有道词典

玩并发比较多的是爬虫,爬虫可以用多线程,线程池去爬。但是我们用requests的时候是阻塞的,无法并发。所以我们要用一个更牛逼的库aiohttp,这个库可以当成是异步的requests。

1).爬取有道词典

有道翻译的API已经做好了,我们可以直接调用爬取。然后解析网页,获取单词的翻译。然后解析网页,网页比较简单,可以有很多方法解析。因为爬虫文章已经泛滥了,我这里就不展开了,很容易就可以获取单词的解释。

2).代码的核心框架设计一个异步的框架,生成一个事件循环

创建一个专门去爬取网页的协程,利用aiohttp去爬取网站内容

生成多个要翻译的单词的url地址,组建一个异步的tasks, 扔到事件循环里面

等待所有的页面爬取完毕,然后用pyquery去一一解析网页,获取单词的解释,部分代码如下:

3).看看并发有多快

费了这么大的劲,用Asyncio这款神器玩并发到底有多快呢,我们来做个对比:

3.1).用Asyncio来异步爬取100个单词:

>>

1 apple -> n. 苹果,苹果树,苹果似的东西;[美俚]炸弹,手榴弹,(棒球的)球;[美俚]人,家伙。

2 apple -> n. 苹果,苹果树,苹果似的东西;[美俚]炸弹,手榴弹,(棒球的)球;[美俚]人,家伙。

。。。

100 apple -> n. 苹果,苹果树,苹果似的东西;[美俚]炸弹,手榴弹,(棒球的)球;[美俚]人,家伙。

Time:2.343923807144165s

3.2).用同步爬取100个单词

如果我们用requests同步去爬取100个单词大概要多久呢,代码很上面类似,只是换成普通的函数即可。

1 apple -> n. 苹果,苹果树,苹果似的东西;[美俚]炸弹,手榴弹,(棒球的)球;[美俚]人,家伙。

2 apple -> n. 苹果,苹果树,苹果似的东西;[美俚]炸弹,手榴弹,(棒球的)球;[美俚]人,家伙。

。。。

100 apple -> n. 苹果,苹果树,苹果似的东西;[美俚]炸弹,手榴弹,(棒球的)球;[美俚]人,家伙。

Time:55.266273021698s

二者相差了28倍,如果并发的任务越多相差的速度会更大。当然以上只是一个举例仅供个人学习asyncio库,不是让大家去爬有道!通过这个简单的并发爬虫让小白可以快速使用Py3里面最强大的库!

asyncio可以和多进程,多线程和多协程配合使用,还有很多地方需要探索,大家可以循序渐进去研究一下!欢迎大家留言讨论。

欢迎关注公众号"菜鸟学Python",目前原创文案400多篇,里面有很多实战案例,需要源码,入门书籍,等你来撩!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值