假设我们有一个虚拟函数:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
有什么区别:
coros = []
for i in range(5):
coros.append(foo(i))
loop = get_event_loop()
loop.run_until_complete(wait(coros))
以及:
from asyncio import ensure_future
futures = []
for i in range(5):
futures.append(ensure_future(foo(i)))
loop = get_event_loop()
loop.run_until_complete(wait(futures))
注意:示例返回一个结果,但这不是问题的焦点。当返回值很重要时,使用gather()
,而不是wait()
。
不管返回值是多少,我都在寻找ensure_future()
的清晰性。wait(coros)
和wait(futures)
都运行协同程序,那么何时以及为什么要将协同程序包装在ensure_future
中?
基本上,使用Python3.5的async
来运行一堆非阻塞操作的正确方法是什么?
额外的积分,如果我想成批打电话怎么办?例如,我需要调用some_remote_call(...)
1000次,但我不想用1000个同时连接来破坏web服务器/数据库/etc。这在线程或进程池中是可行的,但是有没有办法在asyncio
中做到这一点?
文森特的一条评论链接到了https://github.com/python/asyncio/blob/master/asyncio/tasks.py#L346,它表明
wait()
为您将协程包装在ensure_future()
中!换言之,我们确实需要一个未来,而联谊会悄悄地转变成他们。
当我找到一个关于如何批量协同旅行/期货的明确解释时,我会更新这个答案。
相关问题 更多 >
编程相关推荐