0Pricing
Python Academy · บทเรียน

await งาน และการรวบรวมงาน

ใช้ await, asyncio.create_task และ asyncio.gather เพื่อทำงานพร้อมกัน

await งาน และการรวบรวมงาน เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

await เทียบกับการทำงานตามลำดับ

การใช้ await เพียงอย่างเดียวจะเรียกใช้โครูทีนตามลำดับ หากต้องการเรียกใช้แบบ พร้อมกัน ให้ห่อหุ้มโครูทีนเหล่านั้นไว้ในงาน

import asyncio

async def main():
    # Sequential — total ~3 s
    await asyncio.sleep(2)
    await asyncio.sleep(1)

    # Concurrent using gather — total ~2 s
    await asyncio.gather(asyncio.sleep(2), asyncio.sleep(1))

asyncio.create_task()

asyncio.create_task(coro) จัดกำหนดการให้โครูทีนทำงานเป็นงานอิสระพร้อมกันกับโครูทีนปัจจุบัน

import asyncio

async def work(n):
    await asyncio.sleep(n)
    return n

async def main():
    t1 = asyncio.create_task(work(2))
    t2 = asyncio.create_task(work(1))
    r1 = await t1
    r2 = await t2
    print(r1, r2)   # 2 1 (total ~2 s)

asyncio.run(main())

asyncio.gather()

asyncio.gather(*coros) เรียกใช้โครูทีนพร้อมกัน และคืนผลลัพธ์ทั้งหมดตามลำดับเมื่อทุกโครูทีนทำงานเสร็จ

import asyncio

async def fetch(i):
    await asyncio.sleep(1)
    return f"data-{i}"

async def main():
    results = await asyncio.gather(fetch(1), fetch(2), fetch(3))
    print(results)  # ["data-1", "data-2", "data-3"] in ~1 s

asyncio.run(main())

gather กับ return_exceptions

ตั้งค่า return_exceptions=True เพื่อให้โครูทีนที่ล้มเหลวคืนข้อยกเว้นเป็นผลลัพธ์ แทนการยกเลิก gather ทั้งหมด

import asyncio

async def risky(n):
    if n == 2: raise ValueError("bad")
    return n

async def main():
    results = await asyncio.gather(
        risky(1), risky(2), risky(3),
        return_exceptions=True
    )
    print(results)   # [1, ValueError("bad"), 3]

asyncio.wait()

asyncio.wait(tasks, return_when=...) คืนค่าเป็นเซตสองชุด ได้แก่ done และ pending ใช้ FIRST_COMPLETED เพื่อโต้ตอบเมื่อได้ผลลัพธ์แรก

import asyncio

async def slow(): await asyncio.sleep(3); return "slow"
async def fast(): await asyncio.sleep(1); return "fast"

async def main():
    tasks = {asyncio.create_task(slow()), asyncio.create_task(fast())}
    done, pending = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
    for t in pending: t.cancel()

การยกเลิกงาน

เรียก task.cancel() เพื่อร้องขอการยกเลิก งานจะได้รับ asyncio.CancelledError ที่จุด await ถัดไป

import asyncio

async def long_job():
    try:
        await asyncio.sleep(100)
    except asyncio.CancelledError:
        print("Cancelled!")
        raise   # re-raise is required

async def main():
    t = asyncio.create_task(long_job())
    await asyncio.sleep(1)
    t.cancel()
    await t

asyncio.timeout() — Python 3.11 ขึ้นไป

ครอบคำสั่ง await ด้วย asyncio.timeout(seconds) เพื่อยกเลิกการดำเนินการหากใช้เวลานานเกินไป

import asyncio

async def main():
    try:
        async with asyncio.timeout(2):
            await asyncio.sleep(10)   # too slow
    except TimeoutError:
        print("Timed out!")

asyncio.wait_for()

ใน Python รุ่นก่อน 3.11 ให้ใช้ asyncio.wait_for(coro, timeout=N) เพื่อเพิ่มเวลาหมดอายุ ซึ่งจะทำให้เกิด asyncio.TimeoutError

import asyncio

async def slow(): await asyncio.sleep(5)

async def main():
    try:
        await asyncio.wait_for(slow(), timeout=2)
    except asyncio.TimeoutError:
        print("Timed out")

ชื่อและการตรวจสอบงาน

ตั้งชื่องานเพื่อให้แก้จุดบกพร่องได้ง่ายขึ้นด้วย asyncio.create_task(coro, name="...") และตรวจสอบชื่อด้วย task.get_name()

import asyncio

async def worker(): await asyncio.sleep(1)

async def main():
    t = asyncio.create_task(worker(), name="worker-1")
    print(t.get_name())   # worker-1
    await t

TaskGroup — Python 3.11 ขึ้นไป

asyncio.TaskGroup สร้างกลุ่มงานที่มีโครงสร้าง หากงานใดงานหนึ่งทำให้เกิดข้อผิดพลาด งานทั้งหมดจะถูกยกเลิก

import asyncio

async def main():
    async with asyncio.TaskGroup() as tg:
        t1 = tg.create_task(asyncio.sleep(1))
        t2 = tg.create_task(asyncio.sleep(2))
    # all tasks done here

เซมาฟอร์สำหรับจำกัดอัตรา

ใช้ asyncio.Semaphore(n) เพื่อจำกัดจำนวนการดำเนินการที่ทำพร้อมกัน เช่น การเรียกส่วนเชื่อมต่อโปรแกรมประยุกต์

import asyncio

sem = asyncio.Semaphore(5)  # max 5 concurrent

async def limited_fetch(url):
    async with sem:
        await fetch(url)   # at most 5 at a time

ตรวจสอบความเข้าใจอย่างรวดเร็ว

await coro() แตกต่างจาก asyncio.create_task(coro()) อย่างไร

สรุปทบทวน

ใช้ create_task หรือ gather เพื่อดำเนินการพร้อมกัน โดย gather จะรวบรวมผลลัพธ์ทั้งหมด ส่วน wait ให้การควบคุมที่ละเอียดกว่า ยกเลิกงานด้วย .cancel() และกำหนดเวลาหมดอายุด้วย wait_for หรือ asyncio.timeout

คำถามที่พบบ่อย

บทเรียน “await งาน และการรวบรวมงาน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “await งาน และการรวบรวมงาน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “await งาน และการรวบรวมงาน”

ใช้ await, asyncio.create_task และ asyncio.gather เพื่อทำงานพร้อมกัน คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “await งาน และการรวบรวมงาน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. โครูทีนและลูปเหตุการณ์
  2. await งาน และการรวบรวมงาน
  3. ตัวจัดการบริบทและตัววนซ้ำแบบอะซิงก์
  4. รูปแบบอะซิงก์ I/O ในระบบจริง
← กลับไปที่ Python Academy