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 tasyncio.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 tTaskGroup — 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครูทีนและลูปเหตุการณ์
- await งาน และการรวบรวมงาน
- ตัวจัดการบริบทและตัววนซ้ำแบบอะซิงก์
- รูปแบบอะซิงก์ I/O ในระบบจริง