پاسخ تمرین ۱
gather اجازه میدهد چند task را با هم در یک فراخوانی شروع کنیم و منتظرشان بمانیم، و وقتی همه تمام شدند نتیجههایشان را بهصورت یک لیست برگرداند؛ بهجای نوشتن یک await جدا برای هر task.
پاسخ تمرین ۲
جای هر نتیجه بر اساس ترتیبی است که taskها به gather داده شدهاند، نه ترتیب اتمامشان. پس نتیجهی اولین taskی که لیست کردهایم همیشه اول لیست برگشتی است، حتی اگر task دیگری زودتر تمام شده باشد.
پاسخ تمرین ۳
بهمحض اینکه یک task خطا بدهد، همان خطا از خودِ فراخوانی gather صادر میشود و برنامه همانجا با traceback متوقف میشود. حتی اگر task دیگری با موفقیت تمام شده باشد، دیگر نتیجهاش را نمیبینیم.
پاسخ تمرین ۴
با فعالکردن این تنظیم، gather دیگر با اولین خطا کل کار را متوقف نمیکند؛ بهجایش اجازه میدهد هر task تا انتها اجرا شود و اگر خطا داده بود، خودِ خطایش بهعنوان یک عضو از لیست نتیجه — کنار نتیجهی taskهای موفق — قرار میگیرد.
پاسخ تمرین ۵
import asyncio
async def download_file(name):
print(f'download {name} started')
await asyncio.sleep(2)
return name
async def main():
res = await asyncio.gather(
download_file('test1.txt'),
download_file('test2.txt'),
)
print(res) # ['test1.txt', 'test2.txt']
asyncio.run(main()) # ~2s, not 4sپاسخ تمرین ۶
import asyncio
async def download_file(name):
assert '%' not in name, "Bad file name!"
await asyncio.sleep(1)
return name
async def main():
res = await asyncio.gather(
download_file('test.txt'),
download_file('text%.txt'),
return_exceptions=True,
)
print(res) # ['test.txt', AssertionError('Bad file name!')]
asyncio.run(main())پاسخ تمرین ۷
import asyncio
async def call_api(name, delay, fail=False):
await asyncio.sleep(delay)
if fail:
raise RuntimeError(f"{name} failed")
return f"{name} ok"
async def main():
results = await asyncio.gather(
call_api("users", 1),
call_api("orders", 2, fail=True),
call_api("payments", 1),
return_exceptions=True,
)
for r in results:
if isinstance(r, Exception):
print("error:", r)
else:
print("success:", r)
asyncio.run(main())پاسخ تمرین ۸
gather منتظر میماند تا همه تمام شوند و نتایج را یکجا و به ترتیب ورودی میدهد؛ مناسب وقتی همهی نتایج را مرتب و باهم میخواهید. as_completed نتایج را یکییکی و به ترتیب اتمام میدهد؛ مناسب وقتی میخواهید هر نتیجه را بهمحض آمادهشدن پردازش کنید.