asyncio.wait订单是否有保证?

时间:2016-05-18 01:41:10

标签: python python-asyncio

我正在尝试在我的库中实现基于asyncio的公平排队。

在某些函数中,我有一个声明(假设socketX是任务):

done, pending = asyncio.wait(
    [socket1, socket2, socket3],
    return_when=asyncio.FIRST_COMPLETED,
)

现在我多次阅读asyncio.wait的文档,但它不包含我所追求的信息。主要是,我想知道是否:

    我发出呼叫时,
  • socket1socket2socket3恰好已经准备就绪。是否保证done将包含它们全部,或者它只返回一个(或两个)?
  • 在第二种情况下,任务的顺序是否传递给wait()

我试图断言我是否可以在done任务集中应用公平排队(通过挑选一个并留下其他任务以便以后解决)或者我是否还需要关心订单我把任务交给了。

文档对此有点保持沉默。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

这仅根据Python 3.5的source code进行。

如果在调用wait之前完成了未来,则会将它们全部放入done集:

import asyncio

async def f(n):
    return n

async def main():
    (done, pending) = await asyncio.wait([f(1), f(2), f(3)], return_when=asyncio.FIRST_COMPLETED)
    print(done)     # prints set of 3 futures
    print(pending)  # prints empty set

loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()