吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2450|回复: 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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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, 2025-4-21 10:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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