การสร้าง Coroutine Task in Python

Sharing is caring!

ใน Python coroutine เป็นฟังก์ชันที่สามารถทำงานแบบไม่พร้อมกันได้ coroutine จะถูกเรียกใช้งานโดย asyncio.run() หรือ asyncio.run_until_complete()

task เป็นตัวแทนของ coroutine ที่ถูกกำหนดเวลาให้ทำงานแบบไม่พร้อมกัน task จะถูกสร้างขึ้นโดย asyncio.create_task()

ในบทความนี้ เราจะเรียนรู้วิธีสร้าง coroutine task in python อย่างละเอียดยิ่งขึ้น

การสร้าง coroutine

ในการสร้าง coroutine เราต้องสร้างฟังก์ชันโดยใช้คำกริยา async def

ฟังก์ชัน coroutine แตกต่างจากฟังก์ชันปกติตรงที่สามารถใช้คำกริยา await เพื่อรอให้การดำเนินการอื่นเสร็จสิ้น

ตัวอย่างเช่น ต่อไปนี้เป็น coroutine ที่พิมพ์ข้อความ “Hello, world!” และรอ 1 วินาที

async def hello_world():
    print("Hello, world!")
    await asyncio.sleep(1)

การสร้าง task

ในการสร้าง task เราใช้ฟังก์ชัน asyncio.create_task()

ฟังก์ชันนี้รับ coroutine เป็นตัวดำเนินการและสร้าง task ใหม่

ตัวอย่างเช่น ต่อไปนี้เป็นการสร้าง task จาก coroutine hello_world()

import asyncio

async def main():
    task = asyncio.create_task(hello_world())
    await task

asyncio.run(main())

คุณสมบัติของ task

task มีคุณสมบัติหลายประการที่สามารถใช้เพื่อจัดการกับ task เหล่านั้นได้

  • task.done(): ตรวจสอบว่า task เสร็จสิ้นหรือยัง
  • task.result(): ดึงผลลัพธ์ของ task
  • task.cancel(): ยกเลิก task

ตัวอย่างเช่น ต่อไปนี้เป็นตัวอย่างการใช้คุณสมบัติของ task

import asyncio

async def main():
    task = asyncio.create_task(hello_world())
    print("Task is created")

    if task.done():
        print("Task is already finished")
    else:
        print("Task is not finished yet")

    print("Result:", task.result())

    # Cancel task
    task.cancel()

asyncio.run(main())

ผลลัพธ์:

Task is created
Task is not finished yet
Hello, world!
Result: None

ตัวอย่างการใช้งาน

ต่อไปนี้เป็นตัวอย่างการใช้งาน coroutine task

  • การดาวน์โหลดไฟล์

เราสามารถใช้ coroutine task เพื่อดาวน์โหลดไฟล์แบบไม่พร้อมกันได้

import asyncio

async def download_file(url):
    with open(url, "wb") as f:
        response = await requests.get(url)
        f.write(response.content)

async def main():
    tasks = []
    for url in ["https://example.com/file1.txt", "https://example.com/file2.txt"]:
        tasks.append(asyncio.create_task(download_file(url)))

    await asyncio.gather(*tasks)

asyncio.run(main())
  • การประมวลผลข้อมูล

เราสามารถใช้ coroutine task เพื่อประมวลผลข้อมูลแบบไม่พร้อมกันได้

import asyncio

async def process_data(data):
    print(f"Processing data: {data}")
    await asyncio.sleep(1)

async def main():
    tasks = []
    for data in ["data1", "data2", "data3"]:
        tasks.append(asyncio.create_task(process_data(data)))

    await asyncio.gather(*tasks)

asyncio.run(main())

สรุปท้ายบทความ

ในบทความนี้ เราได้เรียนรู้วิธีสร้าง coroutine task in python อย่างละเอียดยิ่งขึ้น

  • ในการสร้าง coroutine เราต้องสร้างฟังก์ชันโดยใช้คำกริยา async def
  • ในการสร้าง task เราใช้ฟังก์ชัน asyncio.create_task()
  • task มีคุณสมบัติหลายประการที่สามารถใช้เพื่อจัดการกับ task เหล่านั้นได้

หวังว่าบทความนี้จะเป็นประโยชน์นะครับ

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *