能被asyncio调用的协程可以通过两种方式实现:
async def
语句第一种方式在Python3.5添加,在没有向下兼容的考虑时推荐使用。
基于生成器的协程应该被@asyncio.coroutine
装饰,尽管这不是严格规定(not strictly enforced)。该装饰器能够兼容async def
定义的协程。基于生成器的协程使用 PEP 380引入的yield from
语法,而不是原始的yield
语法。
result = await future
或者result = yield from future
future
被完成,然后返回future
的结果,或者抛出一个异常,该异常将被传播。(如果future
被取消,将抛出一个CancelledError异常。)要注意的是,tasks
就是futures
,一切关于futures
的也适用于tasks
。result = await coroutine
或者result = yield from coroutine
return expression
raise exception
调用一个协程并不启动它的代码运行——调用返回的协程对象什么也不做,直到你安排它执行。有两种基本的方式使它开始运行:
await coroutine
或者yield from coroutine
协程(以及任务)只能在事件循环运行的时候执行。
yield from
调用async def
定义的协程,并且使该生成器能够被async def
定义的协程调用(比如使用await
语句调用)。async def
定义的协程它们自己。yield from
,一个错误信息将被日志记录。参看Detect coroutines never scheduled。import asyncio
async def hello_world():
print("Hello World!")
loop = asyncio.get_event_loop()
# 阻塞式调用,直到hello_world()协程结束时返回
loop.run_until_complete(hello_world())
# run_until_complete只接受A Future, a coroutine or an awaitable
loop.close()
import asyncio
#
def hello_world(loop):
print('Hello World')
loop.stop()
#
loop = asyncio.get_event_loop()
#
# 安排一个hello_world()的调用
loop.call_soon(hello_world, loop)
#
# 将被loop.stop()打断的阻塞式调用
loop.run_forever()
loop.close()
import asyncio
import datetime
async def display_date(loop):
end_time = loop.time() + 5.0
while True:
print(datetime.datetime.now())
if (loop.time() + 1.0) >= end_time:
break
await asyncio.sleep(1)
# asyncio.sleep睡眠指定时间再返回的协程,asyncio中有相应的调度机制
loop = asyncio.get_event_loop()
loop.run_until_complete(display_date(loop))
loop.close()
compute()
协程被print_sum()
等待:当compute()
被执行完成并返回结果时print_sum()
继续执行import asyncio
async def compute(x, y):
print("Compute %s + %s ..." % (x, y))
await asyncio.sleep(1.0)
return x + y
async def print_sum(x, y):
result = await compute(x, y)
print("%s + %s = %s" % (x, y, result))
loop = asyncio.get_event_loop()
loop.run_until_complete(print_sum(1, 2))
loop.close()
sleep
协程创建了一个内部的future使用 AbstractEventLoop.call_later()
来在一秒后唤醒任务。2024 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123