4.1 方法 run()
模块 asyncio
提供了许多方法和函数 用于创建和管理异步程序。这是一些 asyncio
模块中最受欢迎和最常用的 方法和函数。
今天我们将讨论四个最常用的:
run()
sleep()
wait()
gather()
下面是详细信息:
方法 asyncio.run(coroutine)
这个方法用于运行异步程序。当你想从同步上下文(例如主线程)启动异步代码时,它特别有用。
方法 asyncio.run()
运行主协程并管理 事件循环的创建和关闭。此方法会自动创建一个新的 事件循环,并在协程完成执行后结束该循环。
签名:
asyncio.run(async_function(), *, debug=False)
-
async_function
: 需要执行的协程。 -
debug
: 可选参数,启用事件循环的调试模式。
使用示例:
import asyncio
async def main():
print('Hello')
await asyncio.sleep(1)
print('World')
asyncio.run(main())
限制
不能在其他事件循环内调用:
asyncio.run()
只能从同步代码调用, 因为它创建并结束其自己的事件循环。如果 尝试从现有事件循环内部调用它,会引发错误。
仅适用于顶级:
此方法旨在启动程序的主入口,不应 用于嵌套异步函数调用。
4.2 方法 sleep()
当你需要暂停协程的执行一段时间,同时不阻塞其他协程的执行时,使用此方法。
方法 asyncio.sleep()
在 asyncio
模块中用于 暂停当前协程执行指定的秒数。
这个方法与类似的 time.sleep()
不同之处在于,它允许其他任务在暂停期间执行。这使得它 对于编写需要延迟或等待而不会阻塞主线程的异步程序来说非常有用。
签名:
asyncio.sleep(delay, result=None)
-
delay
: 延迟时间,以秒为单位(可以是小数)。 -
result
: 可选的结果,在延迟结束后返回。
使用示例:
import asyncio
async def main():
print('Start sleeping')
await asyncio.sleep(2)
print('Wake up')
asyncio.run(main())
在此示例中,协程 main
暂停2秒,允许 其他任务在此期间执行,然后继续并打印 "Wake up"。
4.3 方法 wait()
当你需要等待多个异步操作完成,但希望对等待过程有更细致的控制时,此方法很有用。
方法 asyncio.wait()
在 asyncio
模块中允许等待 多个异步任务或协程的完成。可以等待所有任务完成,第一个完成的任务或任何带有错误的任务的完成。
与 gather()
不同,wait()
方法在等待过程中提供了更多的控制,允许设置超时和完成条件。
asyncio.wait()
方法的主要特征
签名:
asyncio.wait(fs, *, timeout=None, return_when=ALL_COMPLETED)
其中:
-
fs
: 需要等待的Future
对象或协程的集合。 -
timeout
: 可选参数, 指定最大等待时间,以秒为单位。如果等待时间 超过,方法返回截至此时完成的任务。 -
return_when
: 条件,定义 方法完成时的条件。可能的值:-
ALL_COMPLETED
: 方法在所有任务完成时返回结果(默认)。 -
FIRST_COMPLETED
: 方法在第一个任务完成时返回结果。 -
FIRST_EXCEPTION
: 方法在任何任务完成且有异常时返回结果。
-
等待多个任务或协程完成。可以指定等待时间 和完成条件。
import asyncio
async def say(what, delay):
await asyncio.sleep(delay)
return what
async def main():
task1 = asyncio.create_task(say('hello', 1))
task2 = asyncio.create_task(say('world', 2))
done, pending = await asyncio.wait([task1, task2], timeout=1.5)
for task in done:
print(task.result())
asyncio.run(main())
在上面的示例中,我们使用 create_task()
方法 将每个协程 say()
包装为 Task
对象,然后将这些任务 的列表传递给 wait()
方法。Task
对象允许协程并行执行,无需等待一个完成才启动另一个。
wait
方法将仅等待任务执行一秒半,然后 返回包含任务的元组:元组的第一个值将包含已经完成的任务 (done)
,第二个是仍在处理中的任务 (pending)
。
4.4 方法 gather()
当你需要并行运行多个异步操作并以列表的形式获取它们的结果时,此方法特别有用。
方法 asyncio.gather()
在 asyncio
模块中用于 并行执行多个异步任务并以列表形式返回它们的结果。这是一种方便的方式来对协程或 任务进行分组并等待它们完成。
asyncio.gather()
方法的主要特征
签名:
asyncio.gather(*coros_or_futures, return_exceptions=False)
其中:
-
coros_or_futures
: 需要执行的协程或Future
对象。 -
return_exceptions
: 布尔值,指示是否 应将异常作为结果返回。默认值为False
。
使用示例
import asyncio
async def say_after(delay, what):
await asyncio.sleep(delay)
return what
async def main():
results = await asyncio.gather(
say_after(1, 'hello'),
say_after(2, 'world')
)
print(results)
asyncio.run(main())
此示例展示了如何使用 asyncio.gather
来 并行执行多个任务,每个任务都有自己的延迟。所有任务的结果将以列表形式返回。与 wait
不同,gather
不仅仅是等待任务完成,还会收集所有协程的结果,对于执行结果重要的情况来说非常方便。
GO TO FULL VERSION