例子1:
import asyncio import requests, time #这是个同步函数变为协程的例子 def requset_baidu(): r = requests.get('https://www.baidu.com/') r.encoding = 'utf-8' time.sleep(1) # assert '百度一下' in r.text print('请求成功!') async def requ_baidu(i): loop = asyncio.get_running_loop() await loop.run_in_executor(None, requset_baidu) return 'hpq' + str(i) if __name__ == '__main__': time1 = time.time() lis = [requ_baidu(i) for i in range(10)] # a, b = asyncio.run(asyncio.wait(lis)) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(lis)) loop.close() time2 = time.time() print(f'耗时{time2 - time1}') ''' 学习总结: 1.主线程中获取event_loop: asyncio.get_event_loop() 2.协程中获取event_loop: asyncio.get_running_loop() 3.将同步函数转为协程:需要在协程中 await loop.run_in_executor(None,同步方法名) 4.asyncio.run() 等价于 loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(lis)) loop.close() 但可能会失败 '''
例子2:
import asyncio import time import aiohttp async def request_baidu(sem): async with sem: async with aiohttp.ClientSession() as session: async with session.get('https://www.baidu.com/') as r: await r.text() assert r.status == 200 print('请求成功!') if __name__ == '__main__': time1 = time.time() loop = asyncio.get_event_loop() # loop = asyncio.new_event_loop() # asyncio.set_event_loop(loop) sem = asyncio.Semaphore(2) a_list = [request_baidu(sem) for i in range(10)] loop.run_until_complete(asyncio.wait(a_list)) loop.close() time2 = time.time() print(f'耗时={time2 - time1}') ''' 学习总结: 1.如何限制协程并发数? 在主线程实例化Semaphore对象,sem = asyncio.Semaphore(2),在搜集协程时多额外传入这个sem 2.async with 的用法,上下文管理器 3.在主线程获取loop:loop = asyncio.get_event_loop() 在其他线程获取loop:loop = asyncio.new_event_loop() 之后再 asyncio.set_event_loop(loop) '''