Yield from coroutine vs yield from task 在此链接中,有一个@dano给出的示例:
import asyncio
@asyncio.coroutine
def test1():
print("in test1")
@asyncio.coroutine
def dummy():
yield from asyncio.sleep(1)
print("dummy ran")
@asyncio.coroutine
def main():
test1()
yield from dummy()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
仅输出
dummy ran
我无法直接对此添加评论,因此我不得不在这里提出一个新问题; (1)为什么在此类常规函数中未按顺序执行test1()。 corutine是否只能使用以下两种方式?
yield from cor()
asyncio.async(cor())
test1()去哪里了?
(2)在理解以下两种使用corutine()函数的方法的区别时,还有其他一些问题。他们是一样的吗?
yield from asyncio.async(cor())
asyncio.async(cor())
我使用以下代码进行解释:
import random
import datetime
global a,b,c
import asyncio
a = [random.randint(0, 1<<256) for i in range(500000)]
b= list(a)
c= list(a)
@asyncio.coroutine
def test1():
global b
b.sort(reverse=True)
print("in test1")
@asyncio.coroutine
def test2():
global c
c.sort(reverse=True)
print("in test2")
@asyncio.coroutine
def dummy():
yield from asyncio.sleep(1)
print("dummy ran")
@asyncio.coroutine
def test_cor():
for i in asyncio.sleep(1):
yield i
@asyncio.coroutine
def main():
test1()
print("hhhh_______________________")
asyncio.async(test1())
asyncio.async(test2())
print("hhhh_______________________")
print("hhh")
asyncio.async(dummy())
yield from test_cor()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print("hhhhhhh")
但是输出是
hhhh_______________________
hhhh_______________________
hhh
in test1
in test2
hhhhhhh
它甚至没有执行dummy()
函数!
我使用
@asyncio.coroutine
def test2():
# global c
# c.sort(reverse=True)
print("in test2")
(3)没有排序,我认为test2应该运行得更快,以便在test2之后输出test1。但是,输出没有改变。我不知道为什么。
(4)并且我还尝试删除了test1()和test2()的排序,然后令人惊讶的是,dummy()运行并输出以下内容。为什么??
hhhh_______________________
hhhh_______________________
hhh
in test1
in test2
dummy ran
hhhhhhh
我不知道这些事情是怎么发生的...。我很困惑。