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())