Diyelim ki kukla bir fonksiyonumuz var:
async def foo(arg):
result = await some_remote_call(arg)
return result.upper()
Aradaki fark nedir:
import asyncio
coros = []
for i in range(5):
coros.append(foo(i))
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
Ve:
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))
Not : Örnek bir sonuç döndürür, ancak sorunun odak noktası bu değildir. Dönüş değeri önemli olduğunda gather()bunun yerine kullanın wait().
Geri dönüş değeri ne olursa olsun, açıklık arıyorum ensure_future(). wait(coros)ve wait(futures)her ikisi de eşdizimleri çalıştırır, öyleyse bir eşgüdüm ne zaman ve neden sarılmalıdır ensure_future?
Temel olarak, Python 3.5'i kullanarak bir dizi engellemesiz işlemi çalıştırmak için Doğru Yol (tm) asyncnedir?
Ekstra kredi için, aramaları gruplandırmak istersem ne olur? Örneğin some_remote_call(...)1000 kez aramam gerekiyor ama web sunucusunu / veritabanını / vb. 1000 eşzamanlı bağlantıyla ezmek istemiyorum. Bu bir iş parçacığı veya işlem havuzu ile yapılabilir, ancak bunu yapmanın bir yolu var asynciomı?
2020 güncellemesi (Python 3.7+) : Bu snippet'leri kullanmayın. Bunun yerine şunu kullanın:
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)
Ayrıca kullanmayı düşünün Trio , asyncio için sağlam bir 3. parti bir alternatif.
ensure_future()mi? Ve sonuca ihtiyacım olursa, kullanamazrun_until_complete(gather(coros))mıyım?