โครูทีนและลูปเหตุการณ์
กำหนดโครูทีนด้วย async def และเรียกใช้ด้วย asyncio.run()
โครูทีนและลูปเหตุการณ์ เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
การทำงานพร้อมกันคืออะไร
Asyncio รองรับ การทำงานพร้อมกันแบบร่วมมือ โดยเธรดเดียวจัดการงานหลายงานด้วยการสลับระหว่างงานเหล่านั้นเมื่อมีงานหนึ่งกำลังรออินพุต/เอาต์พุต
# Traditional: blocking I/O holds the whole thread
# Asyncio: while waiting for I/O, run other coroutines
import asyncio
async def main():
print("Hello")
await asyncio.sleep(1) # yield control
print("World")
asyncio.run(main())async def — ฟังก์ชันโครูทีน
ฟังก์ชันที่กำหนดด้วย async def คือฟังก์ชันโครูทีน การเรียกใช้ฟังก์ชันเหล่านี้จะคืนอ็อบเจ็กต์โครูทีน และฟังก์ชันจะทำงานก็ต่อเมื่อมีการรอหรือจัดกำหนดการให้ทำงาน
import asyncio
async def greet(name):
return f"Hello, {name}"
result = asyncio.run(greet("Alice"))
print(result) # Hello, Aliceลูปเหตุการณ์
ลูปเหตุการณ์ขับเคลื่อนการทำงานของโครูทีน asyncio.run(coro) สร้างลูปเหตุการณ์ใหม่ เรียกใช้โครูทีนจนเสร็จสมบูรณ์ แล้วปิดลูป
import asyncio
async def compute():
await asyncio.sleep(0)
return 42
value = asyncio.run(compute())
print(value) # 42
# For advanced use:
loop = asyncio.new_event_loop()
result = loop.run_until_complete(compute())
loop.close()await หยุดการทำงานชั่วคราว
await expr ระงับโครูทีนปัจจุบันจนกว่า expr ซึ่งเป็นโครูทีนอื่นหรืออนาคต จะทำงานเสร็จ ระหว่างนั้นลูปเหตุการณ์จะเรียกใช้งานอื่น
import asyncio
async def task(name, delay):
print(f"{name} starting")
await asyncio.sleep(delay)
print(f"{name} done")
async def main():
await task("A", 2)
await task("B", 1) # sequential here
asyncio.run(main())asyncio.sleep()
asyncio.sleep(seconds) ระงับโครูทีนปัจจุบันตามเวลาที่กำหนด โดยไม่บล็อกลูปเหตุการณ์
import asyncio
async def heartbeat():
while True:
print("ping")
await asyncio.sleep(1)
# asyncio.run(heartbeat()) # runs foreverasyncio.run() จุดเริ่มต้น
asyncio.run(coro) เป็นจุดเริ่มต้นระดับบนสุดตามมาตรฐาน ห้ามเรียกใช้จากภายในลูปเหตุการณ์ที่กำลังทำงาน
import asyncio
async def main():
print("running")
if __name__ == "__main__":
asyncio.run(main())การตรวจสอบว่ากำลังอยู่ภายในลูปเหตุการณ์หรือไม่
ใช้ asyncio.get_running_loop() เพื่อตรวจสอบว่ามีลูปที่กำลังทำงานอยู่แล้วหรือไม่ โดยจะทำให้เกิด RuntimeError หากไม่มี
import asyncio
async def inner():
loop = asyncio.get_running_loop()
print(f"Loop: {loop}")
asyncio.run(inner())การเรียกใช้โค้ดที่บล็อกการทำงาน
เรียกใช้โค้ดที่ใช้ CPU หนักหรือบล็อกการทำงานด้านอินพุต/เอาต์พุตโดยไม่บล็อกลูปเหตุการณ์ ด้วย loop.run_in_executor(None, func, *args)
import asyncio, time
def blocking():
time.sleep(2)
return "done"
async def main():
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(None, blocking)
print(result)
asyncio.run(main())การเชื่อมโยงโครูทีน
โครูทีนสามารถ await โครูทีนอื่นได้ ทำให้เกิดสายการทำงาน การควบคุมจะไหลลงตามสายและย้อนกลับขึ้นมาเมื่อแต่ละระดับทำงานเสร็จ
import asyncio
async def fetch_data():
await asyncio.sleep(1)
return {"value": 42}
async def process():
data = await fetch_data()
return data["value"] * 2
async def main():
result = await process()
print(result) # 84
asyncio.run(main())การระบุโครูทีน
ใช้ asyncio.iscoroutine(obj) หรือ asyncio.iscoroutinefunction(func) เพื่อตรวจสอบฟังก์ชันแบบอะซิงโครนัสขณะโปรแกรมทำงาน
import asyncio
async def my_coro():
pass
print(asyncio.iscoroutinefunction(my_coro)) # True
coro = my_coro()
print(asyncio.iscoroutine(coro)) # True
coro.close() # clean up the un-awaited coroutineโหมดดีบัก asyncio
เปิดโหมดดีบักเพื่อตรวจจับโครูทีนที่ไม่ได้รอ การเรียกกลับที่ทำงานช้า และปัญหาอื่น ๆ โดยตั้งค่า PYTHONASYNCIODEBUG=1 หรือส่ง debug=True ให้กับ asyncio.run
import asyncio
async def main():
pass
asyncio.run(main(), debug=True)
# Or:
# PYTHONASYNCIODEBUG=1 python script.pyตรวจสอบอย่างรวดเร็ว
asyncio.run(coro) ทำอะไร
สรุปทบทวน
กำหนดโครูทีนด้วย async def เรียกใช้ด้วย asyncio.run() และระงับการทำงานด้วย await ลูปเหตุการณ์จะจัดกำหนดการโครูทีนแบบร่วมมือ และเรียกใช้งานอื่นระหว่างที่งานหนึ่งกำลังรออินพุต/เอาต์พุต
คำถามที่พบบ่อย
บทเรียน “โครูทีนและลูปเหตุการณ์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “โครูทีนและลูปเหตุการณ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “โครูทีนและลูปเหตุการณ์”
กำหนดโครูทีนด้วย async def และเรียกใช้ด้วย asyncio.run() คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “โครูทีนและลูปเหตุการณ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม
ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- โครูทีนและลูปเหตุการณ์
- await งาน และการรวบรวมงาน
- ตัวจัดการบริบทและตัววนซ้ำแบบอะซิงก์
- รูปแบบอะซิงก์ I/O ในระบบจริง