谈到异步库大家可能有点陌生,所以我们今天先从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测试数据/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是什么?【asyncio异步库用法】的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did181044