Python中如何使用asyncio
这篇文章将为大家详细讲解有关Python中如何使用asyncio,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
创新互联公司业务包括:成品网站、企业产品展示型网站建设、高端网站设计、电子商务型网站建设、外贸网站制作(多语言)、成都做商城网站、按需策划设计、营销型网站建设等。效率优先,品质保证,用心服务是我们的核心价值观,我们将继续以良好的信誉为基础,秉承稳固与发展、求实与创新的精神,为客户提供更全面、更优质的互联网服务!
最简单的使用
import asyncioasync def myfun(i):
print('start {}th'.format(i))
await asyncio.sleep(1)
print('finish {}th'.format(i))loop = asyncio.get_event_loop()
myfun_list = (myfun(i) for i in range(10))
loop.run_until_complete(asyncio.gather(*myfun_list))
这样运行,10次等待总共只等待了1秒。
上面代码一些约定俗成的用法记住就好,如
要想异步运行函数,需要在定义函数时前面加
async
后三行都是记住就行,到时候把函数传入
另一种常见的使用方式
上面是第一种常见的用法,下面是另外一种
import asyncioasync def myfun(i):
print('start {}th'.format(i))
await asyncio.sleep(1)
print('finish {}th'.format(i))loop = asyncio.get_event_loop()myfun_list = [asyncio.ensure_future(myfun(i)) for i in range(10)]loop.run_until_complete(asyncio.wait(myfun_list))
这种用法和上面一种的不同在于后面调用的是asyncio.gather
还是asyncio.wait
,当前看成完全等价即可,所以平时使用用上面哪种都可以。
上面是最常看到的两种使用方式,这里列出来保证读者在看其他文章时不会发蒙。
另外,二者其实是有细微差别的
gather
更擅长于将函数聚合在一起wait
更擅长筛选运行状况
一个问题
与之前学过的多线程、多进程相比,asyncio
模块有一个非常大的不同:传入的函数不是随心所欲
比如我们把上面
myfun
函数中的sleep
换成time.sleep(1)
,运行时则不是异步的,而是同步,共等待了10秒如果我换一个
myfun
,比如换成下面这个使用request
抓取网页的函数
import asyncioimport requestsfrom bs4 import BeautifulSoupasync def get_title(a):
url = 'https://movie.douban.com/top250?start={}&filter='.format(a*25)
r = requests.get(url)
soup = BeautifulSoup(r.content, 'html.parser')
lis = soup.find('ol', class_='grid_view').find_all('li')
for li in lis:
title = li.find('span', class_="title").text
print(title)loop = asyncio.get_event_loop()fun_list = (get_title(i) for i in range(10))loop.run_until_complete(asyncio.gather(*fun_list))
依然不会异步执行。
关于Python中如何使用asyncio就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
本文名称:Python中如何使用asyncio
标题链接:http://myzitong.com/article/jsidgd.html