python --同步代码与协程共存

run_until_complete方法调用

import asyncio
import time

# 模拟一个 I/O 等待函数
async def io_wait_function_1():
    print("开始执行 io_wait_function_1")
    # 模拟 I/O 操作,暂停 2 秒
    await asyncio.sleep(2)
    print("io_wait_function_1 执行完成")
    return "结果 1"

# 模拟另一个 I/O 等待函数
async def io_wait_function_2():
    print("开始执行 io_wait_function_2")
    # 模拟 I/O 操作,暂停 1 秒
    await asyncio.sleep(1)
    print("io_wait_function_2 执行完成")
    return "结果 2"

# 同步代码函数
def sync_code():
    print("开始执行同步代码")
    # 模拟同步代码的执行,暂停 0.5 秒
    time.sleep(0.5)
    print("同步代码执行完成,准备启动协程任务")

    # 创建事件循环
    loop = asyncio.get_event_loop()
    # 创建协程任务列表
    tasks = [io_wait_function_1(), io_wait_function_2()]
    # 等待所有协程任务完成
    results = loop.run_until_complete(asyncio.gather(*tasks))
    loop.close()
	"""这样写也行
	t1 = loop.create_task(task1())
    t2 = loop.create_task(task2())
    loop.run_until_complete(asyncio.gather(t1, t2))
	"""

    print("协程任务执行完成,结果如下:")
    for result in results:
        print(result)

    print("继续执行同步代码后续部分")
    # 模拟同步代码后续部分的执行,暂停 0.5 秒
    time.sleep(0.5)
    print("同步代码后续部分执行完成")

if __name__ == "__main__":
    sync_code()

run_forever() 和 run_until_complete() 区别

  • run_forever
    在 Python 的 asyncio 库中,run_forever() 和 run_until_complete() 都是事件循环(loop)的方法,用于控制事件循环的运行,但它们的功能和使用场景有所不同,下面详细介绍两者的区别。
    run_forever()
    功能:run_forever() 方法会启动事件循环并让它持续运行,直到显式调用 loop.stop() 方法来停止事件循环。在事件循环运行期间,它会不断地检查并执行注册的任务和事件。
    使用场景:适用于需要事件循环持续运行,处理不断到来的异步任务或事件的场景,例如服务器程序,需要持续监听网络连接并处理客户端请求。
import asyncio

async def print_message():
    while True:
        print("Hello, World!")
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()
try:
    # 创建任务
    task = loop.create_task(print_message())
    # 启动事件循环并持续运行
    loop.run_forever()
except KeyboardInterrupt:
    print("Stopping event loop...")
finally:
    # 停止事件循环
    loop.stop()
    # 关闭事件循环
    loop.close()

在上述代码中,print_message 协程会不断地打印消息并休眠 1 秒,loop.run_forever() 会让事件循环持续运行,直到用户按下 Ctrl + C 触发 KeyboardInterrupt 异常,然后手动停止并关闭事件循环。

  • run_until_complete()
  • 功能:run_until_complete() 方法会启动事件循环并运行指定的协程或 Future 对象,直到该协程或 Future 完成。当任务完成后,事件循环会停止运行。
  • 使用场景:适用于只需要运行一个或多个特定的协程,并且在这些协程完成后就结束事件循环的场景,例如执行一次性的异步任务。
  • 示例代码:
import asyncio

async def hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

loop = asyncio.get_event_loop()
try:
    # 运行协程直到完成
    loop.run_until_complete(hello())
finally:
    # 关闭事件循环
    loop.close()

在这个例子中,loop.run_until_complete(hello()) 会启动事件循环并执行 hello 协程,当 hello 协程执行完毕后,事件循环会自动停止,然后关闭事件循环。

总结

  • run_forever() 会让事件循环持续运行,直到显式调用 loop.stop() 停止,适用于需要持续处理异步任务的场景。
  • run_until_complete() 会运行指定的协程或 Future 对象,直到其完成后停止事件循环,适用于执行一次性的异步任务。

同步封装协程

import requests
import asyncio

def demo():
    res = requests.get('https://www.baidu.com/').text
    return res


async def warp():
    loop = asyncio.get_running_loop()
    res = await loop.run_in_executor(None, demo)
    print(res)
    return res

async def main():
    a = await warp()
    print(a)

if __name__ == "__main__":
    asyncio.run(main())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值