python await语句_【转载】对python async与await的理解
时间: 2023-07-12 20:41:23 浏览: 158
async和await是Python3.5版本之后引入的关键字,用于协程的实现。协程是一种轻量级的线程,相比于传统的多线程,协程更加高效、灵活和易于维护。
async定义了一个协程函数,该函数在被调用时返回一个协程对象,而不是立即执行。协程函数中可以使用await语句等待另一个协程或者异步操作完成。
await语句用于等待一个协程或者异步操作完成,其后面必须跟一个协程对象或者异步操作对象。在等待期间,事件循环挂起当前协程并处理其他任务,当等待的协程或异步操作完成后,事件循环会恢复该协程的执行,并将其结果返回给await语句。
在协程中使用async和await可以大大简化异步编程的实现,使得代码更加清晰易懂。同时,Python标准库中也提供了许多内置的异步操作函数和协程函数,如asyncio.sleep()和asyncio.wait()等,可以方便地实现异步操作。
相关问题
async def check_connect(office_site_id: str, end_user_id: str, password: str, desktop_type: str = None, desktop_group_id: str = None, desktop_id: str = None): """ 验证桌面连接 """ from fvtdesktop.ad_user_api import AdUserApi client_id = uuid.uuid4().hex token = await AdUserApi.get_login_token(client_id=client_id, office_site_id=office_site_id, end_user_id=end_user_id, password=password, current_stage=get_current_stage()) if desktop_type == 'Desktopgroup': describe = await AdUserApi.describe_desktops(login_token=token.login_token, protocol_type='BOTH', client_id=client_id, session_id=token.session_id, office_site_id=office_site_id) desktop = list(filter(lambda x: 'desktop_group_id' in x.keys() and x['desktop_group_id'] == desktop_group_id, describe)) result = await get_ticket(desktop_id=desktop[0].desktop_id, client_id=client_id, login_token=token.login_token, session_id=token.session_id) if result == 'Again': await sleep(30) result = await get_ticket(desktop_id=desktop[0].desktop_id, client_id=client_id, login_token=token.login_token, session_id=token.session_id) assert result == 'True' else: result = await get_ticket(desktop_id=desktop_id, client_id=client_id, login_token=token.login_token, session_id=token.session_id) if result == 'Again': await sleep(30) result = await get_ticket(desktop_id=desktop_id, client_id=client_id, login_token=token.login_token, session_id=token.session_id) assert result == 'True'
这是一段 Python 代码,它定义了一个名为 "check_connect" 的异步函数(async function)。该函数的目的是验证桌面连接,它接受以下参数:office_site_id(办公地点 ID)、end_user_id(终端用户 ID)、password(密码)、desktop_type(桌面类型,默认为 None)、desktop_group_id(桌面组 ID,默认为 None)和 desktop_id(桌面 ID,默认为 None)。
函数通过调用 "AdUserApi" 中的 "get_login_token" 方法来获取登录 token。如果 "desktop_type" 等于 "Desktopgroup",则调用 "describe_desktops" 方法,获取桌面的详细信息,并过滤出 "desktop_group_id" 等于 "desktop_group_id" 参数的桌面。然后,调用 "get_ticket" 方法来获取桌面连接的票据。如果返回值为 "Again",则等待 30 秒后再次尝试获取票据。最后,使用 "assert" 语句来断言结果是否为 "True"。
如果 "desktop_type" 不等于 "Desktopgroup",则直接调用 "get_ticket" 方法来获取桌面连接的票据,并执行与上述相同的操作。
python await唤醒
### Python 中 `await` 如何唤醒协程
在 Python 的异步编程模型中,事件循环扮演着核心角色。可以将其视为一个持续运行的 `while True` 循环,该循环监控所有的协程,收集哪些协程处于空闲状态,并寻找可执行的任务[^1]。
当某个协程等待特定条件满足时(例如 I/O 操作完成),它会暂停并让出控制权给事件循环。此时,事件循环继续处理其他任务直到触发了该协程所等待的条件。一旦条件达成,事件循环就会重新激活相应的协程,使其从中断的地方恢复执行。
对于具体的实现方式,在使用 `asyncio` 库编写代码时,开发者可以通过定义带有 `async def` 关键字的方法来创建协程对象。这些方法内部通常包含至少一次对另一个协程或 Future 对象调用 `await` 表达式的操作。下面是一个简单的例子展示了如何利用 `await` 来管理并发请求:
```python
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = [
'https://example.com',
'https://another-example.org'
]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
for result in results:
print(result)
if __name__ == '__main__':
asyncio.run(main())
```
在这个例子中,每当遇到 `await` 语句时,当前协程会被挂起并将控制权交还给事件循环去执行其他的任务;而当被等待的操作完成后,对应的协程将会由事件循环自动唤醒并继续其后续逻辑[^2]。
阅读全文