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) async
nedir?
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 asyncio
mı?
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?