2016-11-16 37 views
3

我有什么可能是一个毫无用处的问题,但我觉得我错过了解可能对了解asyncio如何工作很重要的事情。python 3 asyncio:使用run_until_complete(asyncio.wait(corutines_list))执行协程执行顺序

我刚开始ASYNCIO熟悉和我写的代码,这个很基本的一块:

import asyncio 
import datetime 
from random import randint 


async def coroutine(i): 
    start = datetime.datetime.now() 
    print('coroutine {} started.'.format(i)) 
    n = randint(1, 11) 
    await asyncio.sleep(n) 
    end = datetime.datetime.now() 
    print('coroutine {} finished after {} with random = {}.'.format(i, (end-start).seconds, n)) 
    return i 


def simple(): 
    loop = asyncio.get_event_loop() 
    cors = [coroutine(x) for x in range(20)] 
    loop.run_until_complete(asyncio.wait(cors)) 


if __name__ == '__main__': 
    simple() 

这是一个结果我得到:

coroutine 3 started. 
coroutine 9 started. 
coroutine 15 started. 
coroutine 4 started. 
coroutine 10 started. 
coroutine 16 started. 
coroutine 1 started. 
coroutine 5 started. 
coroutine 11 started. 
coroutine 17 started. 
coroutine 2 started. 
coroutine 6 started. 
coroutine 12 started. 
coroutine 18 started. 
coroutine 0 started. 
coroutine 7 started. 
coroutine 13 started. 
coroutine 19 started. 
coroutine 8 started. 
coroutine 14 started. 
coroutine 7 finished after 1 with random = 1. 
coroutine 12 finished after 2 with random = 2. 
coroutine 3 finished after 3 with random = 3. 
coroutine 5 finished after 3 with random = 3. 
coroutine 0 finished after 3 with random = 3. 
coroutine 10 finished after 4 with random = 4. 
coroutine 17 finished after 4 with random = 4. 
coroutine 2 finished after 5 with random = 5. 
coroutine 16 finished after 6 with random = 6. 
coroutine 18 finished after 6 with random = 6. 
coroutine 15 finished after 7 with random = 7. 
coroutine 9 finished after 8 with random = 8. 
coroutine 1 finished after 8 with random = 8. 
coroutine 6 finished after 8 with random = 8. 
coroutine 11 finished after 9 with random = 9. 
coroutine 8 finished after 9 with random = 9. 
coroutine 4 finished after 10 with random = 10. 
coroutine 13 finished after 10 with random = 10. 
coroutine 19 finished after 10 with random = 10. 
coroutine 14 finished after 10 with random = 10. 

现在,我的问题是:为什么在协程开始以混乱的顺序开始? 我期待看到从协程0到协程20的有序“协同x开始”消息...只有当我认为他们会因为随机睡眠时间而争夺...我错过了什么?

回答

1

订单是由.wait()规范undevemenistic。

你不应该关心它。

实际上,所有协程都是在几乎同一时间的同一循环迭代中启动的。

+0

感谢您的回复。你能否把我提到的那个提到的.wait()是不确定的规范的引用连接起来?没有任何运气,我一直在寻找相当多的提示。另外文档字符串非常小。 – Bertone

+0

那么,它从来没有明确说过,但也没有保证任何顺序。 另请参见非常相似[关于gather()]的问题(https://github.com/python/asyncio/issues/432) –