Python 3.5中协程和future/task的区别?

2024-06-16 14:40:27 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我们有一个虚拟函数:

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中做到这一点?


Tags: inloopforasyncremotefooargfuture
1条回答
网友
1楼 · 发布于 2024-06-16 14:40:27

文森特的一条评论链接到了https://github.com/python/asyncio/blob/master/asyncio/tasks.py#L346,它表明wait()为您将协程包装在ensure_future()中!

换言之,我们确实需要一个未来,而联谊会悄悄地转变成他们。

当我找到一个关于如何批量协同旅行/期货的明确解释时,我会更新这个答案。

相关问题 更多 >