Python 的 asyncio
库是用于编写单线程并发代码的库,使用 async/await
语法。它支持异步I/O、事件循环、协程和任务。asyncio
使得可以在单线程内高效执行并发操作,特别适用于I/O密集型和高级别的结构化网络代码。它简化了异步编程模型,提高了程序性能和响应速度,是实现异步编程的关键工具。
python3.4就有asyncio,python3.5用async,await关键字
import time
import asyncio
# 定义异步函数
async def hello():
await asyncio.sleep(1)
print(time.time())
def run():
for i in range(5):
loop.run_until_complete(hello())
loop = asyncio.get_event_loop()
if __name__ =='__main__':
run()
1527595104.8338501
1527595104.8338501
1527595104.8338501
1527595104.8338501
1527595104.8338501
async def 用来定义异步函数,其内部有异步操作。
每个线程有一个事件循环,主线程调用asyncio.get_event_loop()时会创建事件循环
你需要把异步的任务丢给这个循环的run_until_complete()方法,事件循环会安排协同程序的执行。
import time
import asyncio
import aiohttp # 用异步方式获取网页内容
urls = ['https://www.baidu.com'] * 400
async def get_html(url, sem):
async with(sem):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
html = await resp.text()
def main():
loop = asyncio.get_event_loop() # 获取事件循环
sem = asyncio.Semaphore(10) # 控制并发的数量
tasks = [get_html(url, sem) for url in urls] # 把所有任务放到一个列表中
loop.run_until_complete(asyncio.wait(tasks)) # 激活协程
loop.close() # 关闭事件循环
if __name__ == '__main__':
start = time.time()
main()
print(time.time()-start) # 5.03s
html = await xxx
html可以获得参数