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

โครูทีนและลูปเหตุการณ์

กำหนดโครูทีนด้วย 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 forever

asyncio.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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