Python 3.5的异步关键字
PEP 0492将async
关键字添加到Python 3.5中。
Python如何从使用这个操作符中受益? 给出了一个协程的例子是
async def read_data(db):
data = await db.fetch('SELECT ...')
根据这个文件达到
暂停执行read_data协同程序直到db.fetch等待完成并返回结果数据。
这个async
关键字是否实际上涉及到创建新线程或可能使用现有的保留异步线程?
在async
使用保留线程的情况下,它是单独的共享线程吗?
不,协同例程不涉及任何类型的线程。 联合程序允许合作多任务,因为每个联合程序自愿地产生控制。 另一方面,线程在任意点之间在单元之间切换。
截至Python 3.4,可以使用生成器编写协同例程; 通过使用函数体中表达式的yield
或yield from
可以创建一个生成器对象,代码只在遍历生成器时执行。 再加上附加的事件循环库(比如asyncio
),你可以编写协同例程,告诉事件循环他们将会忙(等待I / O),并且另一个协程可以运行在与此同时:
import asyncio
import datetime
@asyncio.coroutine
def display_date(loop):
end_time = loop.time() + 5.0
while True:
print(datetime.datetime.now())
if (loop.time() + 1.0) >= end_time:
break
yield from asyncio.sleep(1)
每当上述代码前进到yield from asyncio.sleep(1)
行的yield from asyncio.sleep(1)
,事件循环可以自由运行一个不同的协程,因为这个例程在下一秒不会做任何事情。
由于生成器可以用于各种任务,而不仅仅是协同例程,并且由于使用生成器语法编写协同例程可能会让新手感到困惑,所以PEP引入了新的语法,使得您可以更清晰地编写一个co -常规。
通过实施PEP,上面的示例可以写成:
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)
生成的coroutine
对象仍然需要事件循环来驱动coroutine
; 一个事件循环将依次await
每个协程序,这将执行那些当前不await
某些事情完成的协程。
优点是,使用本机支持时,您还可以引入其他语法来支持异步上下文管理器和迭代器。 进入和退出一个上下文管理器,或循环迭代器,然后可以成为你的协同例程中的更多点,这表明其他代码可以运行,而不是因为某些东西再次等待。
链接地址: http://www.djcxy.com/p/53253.html