yield與gen.coroutine

def d():
    for i in range(2):
        yield i

def b():
    yield d()
    print("b")
    yield "bb"

def a():
    g_b = b()
    print(g_b)
    g_d = next(g_b)
    print(g_d)
    v_d = next(g_d)
    print(v_d) # 0
    v_d = next(g_d)
    print(v_d) # 1
    b_next = next(g_b)
    print(b_next) # bb

if __name__ == "__main__":
    a()
#---輸出
# <generator object b at 0x00000000033A3E60>
# <generator object d at 0x000000000389F150>
# 0
# 1
# b
# bb

----------------------
def d():
    for i in range(2):
        yield i

def b():
    yield d()
    print("b")

def a():
    g_b = b()
    print(g_b) # <generator object b at 0x00000000033A3E60>
    g_d = next(g_b)
    print(g_d) # <generator object d at 0x000000000389F150>
    v_d = next(g_d)
    print(v_d) # 0
    v_d = next(g_d)
    print(v_d) # 1
    b_next = next(g_b)
    print(b_next)
#---輸出
<generator object b at 0x00000000033A3E60>
<generator object d at 0x000000000349F150>
0
1
b
Traceback (most recent call last):
  File "E:\eclipse-workspace\demo_python\demo\yield_demo.py", line 49, in <module>
    a()
  File "E:\eclipse-workspace\demo_python\demo\yield_demo.py", line 19, in a
    b_next = next(g_b)
StopIteration
----------------------

def d():
    for i in range(2):
        yield i

def b():
    yield d()
    print("b")
    yield

def a():
    g_b = b()
    print(g_b) # <generator object b at 0x00000000033A3E60>
    g_d = next(g_b)
    print(g_d) # <generator object d at 0x000000000389F150>
    v_d = next(g_d)
    print(v_d) # 0
    v_d = next(g_d)
    print(v_d) # 1
    b_next = next(g_b)
    print(b_next)
#---輸出
<generator object b at 0x00000000033A3E60>
<generator object d at 0x000000000349F150>
0
1
b
None

--------------
@gen.coroutine
def gen_d():
    for i in range(10):
        raise gen.Return(i)

@gen.coroutine
def gen_b():
    v = yield gen_d()
    print("b")

@gen.coroutine
def gen_a():
    var = yield gen_b()
    print(var)

if __name__ == "__main__":
    ioloop.IOLoop.current().run_sync(gen_a)
--輸出
b
None
-----------------------------
說明:方法gen_d的註解gen.coroutine去掉以後,
gen_d的返回值再也不是Future類型,gen_b方法在執行以一條語句以後,
不會繼續執行後面的語句
#@gen.coroutine
def gen_d():
    for i in range(10):
        raise gen.Return(i)

@gen.coroutine
def gen_b():
    v = yield gen_d()
    print("b")

@gen.coroutine
def gen_a():
    var = yield gen_b()
    print(var)

if __name__ == "__main__":
    ioloop.IOLoop.current().run_sync(gen_a)
--輸出
0
 -----------------------------
yield直接返回
@gen.coroutine
def gen_d():
    for i in range(10):
        raise gen.Return(i)

@gen.coroutine
def gen_b():
    yield gen_d()

@gen.coroutine
def gen_a():
    var = yield gen_b()
    print(var)

if __name__ == "__main__":
    ioloop.IOLoop.current().run_sync(gen_a)
---
輸出:None
----------------------
raise返回:
@gen.coroutine
def gen_d():
    for i in range(10):
        raise gen.Return(i)

@gen.coroutine
def gen_b():
    raise gen.Return(gen_d())

@gen.coroutine
def gen_a():
    var = yield gen_b()
    print(var)

if __name__ == "__main__":
    ioloop.IOLoop.current().run_sync(gen_a)
輸出:<Future finished result=0>
--------------------------------
有異步的狀況下不能直接返回:
@gen.coroutine
def gen_d():
    url = "http://x.x.x.x:8060/api/v1/health"
    result = yield AsyncHTTPClient(defaults=dict(request_timeout=10)).fetch(url, method="GET")
    raise gen.Return((result.code, result.body))

@gen.coroutine
def gen_b():
    raise gen.Return((yield gen_d()))

@gen.coroutine
def gen_a():
    var = yield gen_b()
    print(var)

if __name__ == "__main__":
    ioloop.IOLoop.current().run_sync(gen_a)
輸出:(200, b'ok')
相關文章
相關標籤/搜索