Asyncio协程的使用详解

Asyncio协程的使用详解

爬虫中使用的最多的就是协程了,协程的使用确实比较难理解,但是总归就在写代码,通过代码自己实践比几千字的解释更有用

asyncio.sleep(delay, result=None, *, loop=None)

sleep()总是挂起当前任务,允许运行其他任务。自3.8版起已弃用,将在3.10版中删除:循环参数。

通过协程的方式请求百度:
import aiohttp
import asyncio
import ssl
async def fetch(session,url):
    async with session.get(url,ssl=ssl.SSLContext()) as response:
        return await response.text()
async def main():
    async with aiohttp.ClientSession() as session:
        html=await fetch(session,'https://baidu.com')
        print(html)
        
loop=asyncio.get_event_loop()#定义事件循环
loop.run_until_complete(main())#直到main()函数执行完毕,事件循环结束

通过过gather方法


import asyncio
async def a(t):
    print('-->',t)
    await asyncio.sleep(0.5)
    print('<--',t)
    return t*10
def main():
    futs=[a(t) for t in range(4)]
    print(futs)
    ret=asyncio.gather(*futs) #参数前必须加*
    print(ret)
    loop=asyncio.get_event_loop()
    ret1=loop.run_until_complete(ret)
    print(ret1)
main()

通过create_task()方法

使用高级asyncio.create_task()函数创建任务,或使用低级loop.create_task()函数或确保_future()函数。不鼓励手动实例化任务。

#通过create_task()方法
import asyncio
async def a(t):
    print('-->',t)
    await asyncio.sleep(0.5)
    print('<--',t)
    return t*10
async def b():
    cou=0
    while 1: #死循环
        cou+=1
        cor=a(cou) #cou传入函数a中
        resp=loop.create_task(cor)#创建任务
        await asyncio.sleep(0.5)
        #print(resp)
loop=asyncio.get_event_loop()#定义事件循环
loop.run_until_complete(b())#直到函数b执行完毕,事件循环结束
分享到 :

发表评论

登录... 后才能评论