پاسخ تمرینات آموزش ماژول Asyncio – بهبود عملکرد با Gather

Please login to bookmark Close


پاسخ تمرین ۱

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 نتایج را یکی‌یکی و به ترتیب اتمام می‌دهد؛ مناسب وقتی می‌خواهید هر نتیجه را به‌محض آماده‌شدن پردازش کنید.

Please login to bookmark Close
نظرات

دیدگاهتان را بنویسید

فهرست مطالب

سرفصل دوره

تمرین

این قسمت تمرین ندارد!

پاسخ تمرین ها

هنوز برای تمرین‌های این قسمت پاسخی ثبت نشده است!

اشتراک گذاری

چرا بهتره از فیلترشکن استفاده کنید؟

من همه ویدئو ها و پادکست های کُدباز رو توی یوتیوب و ساندکلود و پلتفرم هایی آپلود می‌کنم که اغلب فیلتر هستند.

اغلب آموزش‌ها ویدئو و پادکست دارند. پس اگر می‌خواهید از محتوای سایت بیشترین استفاده رو ببرید نیاز به فیلتر شکن دارید.

توجه داشته باشید که برای خرید از فروشگاه بهتره فیلتر شکن رو خاموش کنید.

تنظیمات

انتخاب زبان
تغییر تم