程序里面的执行顺序?

时间:2019-08-19 15:51:49

标签: python python-3.x python-asyncio

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

我不知道这些事情是怎么发生的...。我很困惑。

0 个答案:

没有答案