吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2227|回复: 3
收起左侧

[Python 转载] Python实例记录----异步(协程的实现)

[复制链接]
BoBuo 发表于 2022-3-4 23:52
接上篇帖子:https://www.52pojie.cn/thread-1596989-1-1.html
'''
在前面的代码中,我们用一个网络请求作为例子,这本身就是一个耗时的等待操作,因为
在请求网页之后需要等待页面响应并返回结果。耗时等待操作一般都是IO操作,例如文件读取、
网络请求等。协程在处理这种操作时是有很大优势的,当遇到需要等待的情况时,程序可以暂时挂起,
转而执行其他操作,从而避免因一直等待一个程序儿耗费过多的时间,能够充分利用资源

要实现异步,需要了解await关键字的用法,它可以将耗时等待的操作挂起,让出控制权。
如果协程在执行的时候遇到await,事件循环就会将本协程挂起,转而执行别的协程,直到
其他协程挂起或执行完毕。
await后的对象必须是如下格式之一:
    一个原生协程对象
    一个由typecoroutine修饰的生成器,这个生成器可以反回协程对象
    由一个包含__await__方法的对象返回的迭代器

requests返回的对象不能和await一起使用。只有使用支持异步请求操作的请求方式才可以实现真正的异步,aiohttp
'''
[Python] 纯文本查看 复制代码
import asyncioimport aiohttp
import time

start = time.time()

async def get(url):
    session = aiohttp.ClientSession()
    response = await session.get(url)  # 利用aiohttp库里ClientSession类的get方法进行请求。
    await response.text()
    await session.close()
    return response

async def request():
    url = 'http://www.httpbin.org/delay/5'
    print('Waiting for',url)
    respones = await get(url)
    print('Get response from',url,'response',respones)

tasks = [asyncio.ensure_future(request()) for _ in range(10)]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print('Cost time:',end - start)

免费评分

参与人数 1吾爱币 +1 收起 理由
iandros + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

出入平安 发表于 2022-3-5 01:12
感谢楼主,学习一下
deffedyy 发表于 2022-3-5 10:47
coldgrace 发表于 2023-10-16 00:22
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 08:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表