به تکه کد زیر توجه کنید:
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