2个例子加深python协程理解

例子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)
'''
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值