美文网首页
python中的协程的理解

python中的协程的理解

作者: 北雁南飞_8854 | 来源:发表于2019-10-03 22:00 被阅读0次

yield from x
对x做的第一件事情就是调用iter(x),从中获取一个迭代器(iterator),这意味着x可以是任何可迭代(iterable)的对象。

  1. yield from可用于简化for循环中的yield表达式
>>> def gen():
...    for c in 'AB':
...        yield c
...     for i in range(1, 3):
...        yield i
...
>>> list(gen())
['A', 'B', 1, 2]

可简化为:

>>> def gen():
...     yield from 'AB'
...     yield from range(1, 3)
...
>>> list(gen())
['A', 'B', 1, 2]

另外一个例子:

>>> def chain(*iterables):
...     for it in iterables:
...         yield from it
...
>>> s = 'ABC'
>>> t = tuple(range(3))
>>> list(chain(s, t))
['A', 'B', 'C', 0, 1, 2]

Chaining Coroutines

1. Coroutines(async def 和await)

python 3.5引入了async def表示一个函数是一个coroutine对象,和await结合使用。
一个coroutine能启动另一个coroutine、并等待它的结果。一个应用场景是:将一个task拆分为几个可用的组件、并按顺序执行。
例子:

#!/usr/bin/env python3
# asyncio_coroutine_chain.py
import asyncio


async def outer():
    print('in outer')
    print('waiting for result1')
    result1 = await phase1()
    print('waiting for result2')
    result2 = await phase2(result1)
    return result1, result2


async def phase1():
    print('in phase1')
    return 'result1'


async def phase2(arg):
    print('in phase2')
    return 'result2 derived from {}'.format(arg)


if __name__ == '__main__':
    event_loop = asyncio.get_event_loop()
    try:
        return_value = event_loop.run_until_complete(outer())
        print('return value: {!r}'.format(return_value))
    finally:
        event_loop.close()

输出:
in outer
waiting for result1
in phase1
waiting for result2
in phase2
return value: ('result1', 'result2 derived from result1')

2. generator functions(@asyncio.coroutine和yield from)

python3.5以前的版本使用generator functions、并加上asyncio.coroutine() decorator、和yield from一起可以实现同样的效果。

#!/usr/bin/env python3
# asyncio_generator_chain.py

import asyncio


@asyncio.coroutine
def outer():
    print('in outer')
    print('waiting for result1')
    result1 = yield from phase1()
    print('waiting for result2')
    result2 = yield from phase2(result1)
    return result1, result2


@asyncio.coroutine
def phase1():
    print('in phase1')
    return 'result1'


@asyncio.coroutine
def phase2(arg):
    print('in phase2')
    return 'result2 derived from {}'.format(arg)


event_loop = asyncio.get_event_loop()
try:
    return_value = event_loop.run_until_complete(outer())
    print('return value: {!r}'.format(return_value))
finally:
    event_loop.close()

输出:
in outer
waiting for result1
in phase1
waiting for result2
in phase2
return value: ('result1', 'result2 derived from result1')

相关文章

  • Python协程

    最近对Python中的协程挺感兴趣,这里记录对协程的个人理解。 要理解协程,首先需要知道生成器是什么。生成器其实就...

  • Python 协程的基本概念

    Python 协程的基本概念 在学习 Python 基础的过程中,遇到了比较难理解的地方,那就是协程。刚开始看了廖...

  • python中的协程的理解

    yield from x对x做的第一件事情就是调用iter(x),从中获取一个迭代器(iterator),这意味着...

  • python异步协程(aiohttp,asyncio)

    python异步协程 环境:python3.7.0 协程 协程,英文叫做 Coroutine,又称微线程,纤程,协...

  • python 协程 1:yield 10分钟入门

    协程定义 协程的底层架构是在pep342 中定义,并在python2.5 实现的。 python2.5 中,yie...

  • Python基础学习之六yield

    协程定义 协程的底层架构是在pep342 中定义,并在python2.5 实现的。 python2.5 中,yie...

  • 多任务-协程

    一、协程的概念 协程,又称微线程,纤程。英文名Coroutine。协程是python中另外一种实现多任务的方式,只...

  • 理解Python中的yield以及协程

    要理解yield,必须先清楚可迭代对象、迭代器和生成器的概念。 一、可迭代对象 大部分对象都是可迭代,只要实现了_...

  • Kotlin协程使用

    目录 协程的用法 协程同步异步请求与Rxjava,原生写法的区别与优势 对于协程的理解 1.协程的用法 在安卓中添...

  • Python中的协程

    Coroutine in Python 引言: 本文出自David Beazley 的关于协程的PPT,现在笔者将...

网友评论

      本文标题:python中的协程的理解

      本文链接:https://www.haomeiwen.com/subject/zehjpctx.html