Скажімо, у нас є фіктивна функція:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
Яка різниця між:
import asyncio
coros = []
for i in range(5):
coros.append(foo(i))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
І:
import asyncio
futures = []
for i in range(5):
futures.append(asyncio.ensure_future(foo(i)))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))
Примітка . Приклад повертає результат, але це не є питанням фокусу питання. Якщо значення повернення має значення, використовуйте gather()
замість wait()
.
Незалежно від вартості повернення, я шукаю чіткість ensure_future()
. wait(coros)
і wait(futures)
обидва виконують супроводи, то коли і навіщо слід обгортати супровід ensure_future
?
В основному, який правильний спосіб (tm) запустити купу неблокуючих операцій за допомогою Python 3.5 async
?
Що робити для отримання додаткового кредиту, якщо я хочу групувати дзвінки? Наприклад, мені потрібно зателефонувати some_remote_call(...)
1000 разів, але я не хочу руйнувати веб-сервер / базу даних / тощо з 1000 одночасних з'єднань. Це можливо зробити за допомогою потоку чи пулу процесів, але чи можна це зробити asyncio
?
Оновлення до 2020 року (Python 3.7+) : не використовуйте ці фрагменти. Замість цього використовуйте:
import asyncio
async def do_something_async():
tasks = []
for i in range(5):
tasks.append(asyncio.create_task(foo(i)))
await asyncio.gather(*tasks)
def do_something():
asyncio.run(do_something_async)
Також розгляньте можливість використання Тріо , надійної третьої альтернативи асинціо.
ensure_future()
? І якщо мені потрібен результат, чи не можу я просто використатиrun_until_complete(gather(coros))
?