我正在尝试在我的库中实现基于asyncio的公平排队。
在某些函数中,我有一个声明(假设socketX
是任务):
done, pending = asyncio.wait(
[socket1, socket2, socket3],
return_when=asyncio.FIRST_COMPLETED,
)
现在我多次阅读asyncio.wait
的文档,但它不包含我所追求的信息。主要是,我想知道是否:
socket1
,socket2
和socket3
恰好已经准备就绪。是否保证done
将包含它们全部,或者它只返回一个(或两个)?wait()
?我试图断言我是否可以在done
任务集中应用公平排队(通过挑选一个并留下其他任务以便以后解决)或者我是否还需要关心订单我把任务交给了。
文档对此有点保持沉默。有什么想法吗?
答案 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()