Katakanlah kita memiliki fungsi dummy:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
Apa perbedaan antara:
import asyncio
coros = []
for i in range(5):
coros.append(foo(i))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
Dan:
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))
Catatan : Contoh mengembalikan hasil, tetapi ini bukan fokus pertanyaan. Ketika hal-hal nilai kembali, menggunakan gather()
bukan wait()
.
Terlepas dari nilai pengembaliannya, saya mencari kejelasan tentang ensure_future()
. wait(coros)
dan wait(futures)
keduanya menjalankan coroutine, jadi kapan dan mengapa coroutine harus digabungkan ensure_future
?
Pada dasarnya, apa Cara yang Benar (tm) untuk menjalankan banyak operasi non-pemblokiran menggunakan Python 3.5 async
?
Untuk kredit ekstra, bagaimana jika saya ingin melakukan batch panggilan? Misalnya, saya perlu menelepon some_remote_call(...)
1000 kali, tetapi saya tidak ingin menghancurkan server web / database / dll dengan 1000 koneksi simultan. Ini dapat dilakukan dengan utas atau kumpulan proses, tetapi adakah cara untuk melakukannya asyncio
?
Pembaruan 2020 (Python 3.7+) : Jangan gunakan cuplikan ini. Sebagai gantinya gunakan:
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)
Pertimbangkan juga untuk menggunakan Trio , alternatif pihak ketiga yang tangguh untuk asyncio.
ensure_future()
? Dan jika saya membutuhkan hasilnya, tidak bisakah saya menggunakan sajarun_until_complete(gather(coros))
?