async def 和协程,什么是 link
async def and coroutines, what's the link
我正在努力研究 Python3 中出现的新异步功能。
我从在 Whosebug 上找到的一个简单的 worker 示例开始,稍作修改:
import asyncio, random
q = asyncio.Queue()
@asyncio.coroutine
def produce(name):
while True:
value = random.random()
yield from q.put(value)
print("Produced by {0}".format(name))
yield from asyncio.sleep(1.0 + random.random())
@asyncio.coroutine
def consume(name):
while True:
value = yield from q.get()
print("Consumed by {0} ({1})".format(name, q.qsize()))
yield from asyncio.sleep(1.2 + random.random())
loop = asyncio.get_event_loop()
loop.create_task(produce('X'))
loop.create_task(produce('Y'))
loop.create_task(consume('A'))
loop.create_task(consume('B'))
loop.run_forever()
我基本上理解它是如何工作的(也许除了 yield from asyncio.sleep()
... 它是一个委托但阻塞函数的占位符吗?它屈服于哪里?)
但是,最重要的是,我如何才能转换此示例以使用新奇特的 async def
和 await
关键字?收获是什么?
这篇文章是我发现最有帮助的文章。
http://www.snarky.ca/how-the-heck-does-async-await-work-in-python-3-5
只需更换
@asyncio.coroutine
def f(arg)
与
async def f(arg)
和 yield from
以及代码中的 await
。
另请阅读 PEP 412 关于 async with
和 async for
的内容。
我正在努力研究 Python3 中出现的新异步功能。
我从在 Whosebug 上找到的一个简单的 worker 示例开始,稍作修改:
import asyncio, random
q = asyncio.Queue()
@asyncio.coroutine
def produce(name):
while True:
value = random.random()
yield from q.put(value)
print("Produced by {0}".format(name))
yield from asyncio.sleep(1.0 + random.random())
@asyncio.coroutine
def consume(name):
while True:
value = yield from q.get()
print("Consumed by {0} ({1})".format(name, q.qsize()))
yield from asyncio.sleep(1.2 + random.random())
loop = asyncio.get_event_loop()
loop.create_task(produce('X'))
loop.create_task(produce('Y'))
loop.create_task(consume('A'))
loop.create_task(consume('B'))
loop.run_forever()
我基本上理解它是如何工作的(也许除了 yield from asyncio.sleep()
... 它是一个委托但阻塞函数的占位符吗?它屈服于哪里?)
但是,最重要的是,我如何才能转换此示例以使用新奇特的 async def
和 await
关键字?收获是什么?
这篇文章是我发现最有帮助的文章。
http://www.snarky.ca/how-the-heck-does-async-await-work-in-python-3-5
只需更换
@asyncio.coroutine
def f(arg)
与
async def f(arg)
和 yield from
以及代码中的 await
。
另请阅读 PEP 412 关于 async with
和 async for
的内容。