ITPub博客

首页 > 应用开发 > Python > Python协程对象的唤醒

Python协程对象的唤醒

原创 Python 作者:raptors 时间:2025-11-12 16:17:27 0 删除 编辑

# Python协程对象的唤醒


在Python中,协程对象的唤醒通常指的是恢复一个暂停的协程的执行。这主要通过以下几种方式实现:


## 1. 使用 `send()` 方法唤醒协程


协程可以通过 `send()` 方法接收值并恢复执行:


```python

async def simple_coroutine():

    print("协程开始")

    x = await asyncio.sleep(1)  # 暂停点

    print("协程恢复")


coro = simple_coroutine()

# 启动协程

coro.send(None)  # 或 next(coro)

# 协程会在await处暂停

# 稍后可以通过事件循环自动恢复

```


## 2. 使用 `asyncio` 事件循环唤醒


在异步编程中,协程通常由事件循环管理:


```python

import asyncio


async def my_coroutine():

    print("协程执行")

    await asyncio.sleep(1)

    print("协程恢复")


async def main():

    task = asyncio.create_task(my_coroutine())

    await task  # 事件循环会自动调度和唤醒协程


asyncio.run(main())

```


## 3. 使用 `throw()` 唤醒并抛出异常


可以通过 `throw()` 方法唤醒协程并同时抛出异常:


```python

async def excepting_coroutine():

    try:

        await asyncio.sleep(10)

    except ValueError:

        print("捕获到异常")


coro = excepting_coroutine()

coro.send(None)  # 启动协程

coro.throw(ValueError)  # 唤醒并抛出异常

```


## 4. 使用 `asyncio.Future` 或 `Task` 唤醒


当使用 `asyncio` 时,协程通常被包装为 `Task` 对象,当 `Future` 完成时,关联的协程会被自动唤醒:


```python

import asyncio


async def waiter(future):

    result = await future

    print(f"得到结果: {result}")


async def main():

    loop = asyncio.get_running_loop()

    future = loop.create_future()

    

    task = asyncio.create_task(waiter(future))

https://zq.zhaopin.com/moment/71122154

https://zq.zhaopin.com/moment/71122130

https://zq.zhaopin.com/moment/71122112

https://zq.zhaopin.com/moment/71121544

https://zq.zhaopin.com/moment/71121428

https://zq.zhaopin.com/moment/71121367

https://zq.zhaopin.com/moment/71121315

https://zq.zhaopin.com/moment/71121158

https://zq.zhaopin.com/moment/71120836

https://zq.zhaopin.com/moment/71120777

https://zq.zhaopin.com/moment/71120712

https://zq.zhaopin.com/moment/71120546

https://zq.zhaopin.com/moment/71120372

https://zq.zhaopin.com/moment/71120262

https://zq.zhaopin.com/moment/71120141

https://zq.zhaopin.com/moment/71119979

https://zq.zhaopin.com/moment/71119904

https://zq.zhaopin.com/moment/71119825

https://zq.zhaopin.com/moment/71119762

https://zq.zhaopin.com/moment/71119681

https://zq.zhaopin.com/moment/71119454



    

    await asyncio.sleep(1)

    future.set_result(42)  # 这会唤醒waiter协程


asyncio.run(main())

```


## 注意事项


1. 直接调用 `send()` 或 `throw()` 是低级API,通常在异步框架内部使用

2. 在大多数应用代码中,应该使用 `asyncio` 高级API来管理协程

3. 协程只能被唤醒一次,执行完成后就无法再次唤醒

4. 确保协程在暂停状态时才能唤醒,否则会引发异常


在正常的异步编程中,你通常不需要手动唤醒协程,事件循环会自动处理这些细节。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101097/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448