آموزش ماژول asyncio – متد as_completed

Please login to bookmark Close

به تکه کد زیر توجه کنید:

import asyncio

async def download_file(file_name, weight):
    print(f'dowload {file_name} started')
    await asyncio.sleep(weight)
    print(f'dowload {file_name} finished')
    return file_name

async def manage_downloads():
    t1 = asyncio.create_task(download_file('test1.txt', 1))
    t2 = asyncio.create_task(download_file('text2.txt', 2))

    print(await t1)
    print(await t2)

asyncio.run(manage_downloads())

توضیح کد بالا:

در این کد t1 زودتر به اتمام می‌رسد به همین دلیل خروجی مشابه زیر است:

dowload test1.txt started
dowload text2.txt started
dowload test1.txt finished
test1.txt
dowload text2.txt finished
text2.txt

اکنون با کمی تغییر در کد بالا کاری می‌کنیم که t2 زودتر تمام شود

import asyncio

async def download_file(file_name, weight):
    print(f'dowload {file_name} started')
    await asyncio.sleep(weight)
    print(f'dowload {file_name} finished')
    return file_name

async def manage_downloads():
    t1 = asyncio.create_task(download_file('test1.txt', 2))
    t2 = asyncio.create_task(download_file('text2.txt', 1))

    print(await t1)
    print(await t2)

asyncio.run(manage_downloads())

خروجی کد بالا مشابه زیر خواهد بود:

dowload test1.txt started
dowload text2.txt started
dowload text2.txt finished
dowload test1.txt finished
test1.txt
text2.txt

همانطور که مشخص است باز هم باید ابتدا خروجی t1 بیاید و سپس می‌توان به خروجی t2 دسترسی یافت. فقط به این دلیل که ابتدا t1 را await کرده‌ایم.

متد as_completed این امکان را می‌دهد که بین همه task ها هر کدام اول خروجی اش آمد بتوانیم از آن خروجی استفاده کنیم.

import asyncio

async def download_file(file_name, weight):
    print(f'dowload {file_name} started')
    await asyncio.sleep(weight)
    print(f'dowload {file_name} finished')
    return file_name

async def manage_downloads():
    t1 = asyncio.create_task(download_file('test1.txt', 2))
    t2 = asyncio.create_task(download_file('text2.txt', 1))

    for task in asyncio.as_completed([t1, t2]):
        print(await task)

asyncio.run(manage_downloads())

خروجی این کد شبیه زیر خواهد بود:

dowload test1.txt started
dowload text2.txt started
dowload text2.txt finished
text2.txt
dowload test1.txt finished
test1.txt
Please login to bookmark Close
نظرات

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

فهرست مطالب

سرفصل دوره

تمرین

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

پاسخ تمرین ها

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

اشتراک گذاری

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

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

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

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

تنظیمات

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