ผู้มอบหมายงานใน Python กับ Asyncio
![](https://post.nghiatu.com/assets/images/m/max/724/1*bYU_tPNlzrNZ1RUdWD0kdA.jpeg)
การเขียนโปรแกรมตามเหตุการณ์เป็นกระบวนทัศน์การเขียนโปรแกรมซึ่งการไหลของโปรแกรมถูกกำหนดโดยเหตุการณ์ที่เกิดขึ้นแทนที่จะเป็นลำดับของคำสั่งที่ดำเนินการตามลำดับ ในการเขียนโปรแกรมตามเหตุการณ์ โปรแกรมจะตอบสนองต่อเหตุการณ์ในระบบหรือสภาพแวดล้อมแทนที่จะดำเนินการตามชุดคำสั่งที่กำหนดไว้ล่วงหน้า
แหล่งที่มาต่างๆ เช่น การป้อนข้อมูลของผู้ใช้ เหตุการณ์ของระบบ กิจกรรมเครือข่าย หรือตัวจับเวลา สามารถทริกเกอร์เหตุการณ์ได้ เมื่อเหตุการณ์เกิดขึ้น โปรแกรมสามารถตอบสนองต่อเหตุการณ์นั้นได้โดยดำเนินการอย่างน้อยหนึ่งฟังก์ชันหรือการเรียกกลับที่ลงทะเบียนเพื่อจัดการกับเหตุการณ์เฉพาะนั้น สิ่งนี้ทำให้โปรแกรมมีความยืดหยุ่นและตอบสนองมากขึ้น เนื่องจากสามารถตอบสนองต่อเหตุการณ์ที่เกิดขึ้นแทนที่จะรอให้ลำดับของการกระทำเฉพาะเสร็จสิ้น
การเขียนโปรแกรมตามเหตุการณ์มักใช้ในส่วนติดต่อผู้ใช้แบบกราฟิก (GUI) ซึ่งการดำเนินการของผู้ใช้ เช่น การคลิกเมาส์หรือการป้อนข้อมูลด้วยแป้นพิมพ์จะถือว่าเป็นเหตุการณ์ที่กระตุ้นการดำเนินการหรือการอัปเดตในโปรแกรม นอกจากนี้ยังใช้ในการพัฒนาเว็บ ซึ่งคำขอ HTTP หรือเหตุการณ์ของเบราว์เซอร์จะทริกเกอร์การดำเนินการโค้ดฝั่งเซิร์ฟเวอร์หรือฝั่งไคลเอ็นต์ สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ยังกลายเป็นเรื่องปกติมากขึ้นในระบบแบบกระจาย โดยที่ข้อความหรือเหตุการณ์สื่อสารระหว่างบริการหรือส่วนประกอบต่างๆ
ผู้มอบหมายงาน
ในบริบทของการเขียนโปรแกรมตามเหตุการณ์ ผู้มอบหมายงานคือวัตถุที่รับเหตุการณ์แล้วส่งไปยังตัวจัดการเหตุการณ์ที่เหมาะสม ผู้มอบหมายงานมีหน้าที่จัดการการลงทะเบียนและยกเลิกการลงทะเบียนของตัวจัดการเหตุการณ์ และตรวจสอบให้แน่ใจว่าเหตุการณ์ถูกส่งไปยังตัวจัดการที่ถูกต้อง
ในบางเฟรมเวิร์กที่ขับเคลื่อนด้วยเหตุการณ์ โปรแกรมเลือกจ่ายงานจะเรียกว่าบัสหรือลูปเหตุการณ์ บัสเหตุการณ์รับและส่งเหตุการณ์จากแหล่งต่างๆ ไปยังตัวจัดการเหตุการณ์ที่เหมาะสม ลูปเหตุการณ์จัดการการตั้งเวลาและการดำเนินการของ coroutines และการโทรกลับเพื่อตอบสนองต่อเหตุการณ์
ผู้มอบหมายงานยังสามารถทำงานอื่นๆ เช่น การกรองและการประมวลผลเหตุการณ์ ก่อนที่จะถูกส่งไปยังตัวจัดการเหตุการณ์ ตัวอย่างเช่น ผู้มอบหมายงานอาจใช้รูปแบบการเผยแพร่-สมัครสมาชิก โดยที่เหตุการณ์จะถูกกรองและส่งไปยังตัวจัดการเหตุการณ์เหล่านั้นเท่านั้นที่สมัครรับข้อมูลเหล่านั้น
สร้าง Dispatcher ใน Python ด้วย Asyncio
ในการสร้าง dispatcher โดยใช้ asyncio ใน Python คุณสามารถใช้คลาสasyncio.Queue
เพื่อสร้างคิวที่สามารถใช้เพื่อส่งข้อความระหว่าง coroutines ต่อไปนี้เป็นตัวอย่างของการปรับใช้ผู้มอบหมายงานอย่างง่าย สร้างไฟล์dispatcher.py
และใส่รหัสต่อไปนี้:
import asyncio
async def producer(queue):
for i in range(10):
await asyncio.sleep(1)
await queue.put(i)
await queue.put(None)
async def consumer(queue):
while True:
item = await queue.get()
if item is None:
break
print(f"Consumed: {item}")
queue.task_done()
async def main():
queue = asyncio.Queue()
tasks = [
asyncio.create_task(producer(queue)),
asyncio.create_task(consumer(queue)),
]
await asyncio.gather(*tasks)
await queue.join()
asyncio.run(main())
ในmain
โครูทีน เราสร้างอินสแตนซ์ของasyncio.Queue
และส่งต่อไปยังทั้ง โครูทีน producer
และconsumer
โครูทีน จากนั้นเราสร้างงานสำหรับโครูทีนทั้งสองโดยใช้asyncio.create_task()
และส่งต่อasyncio.gather()
เพื่อเรียกใช้พร้อมกัน สุดท้ายก็โทรqueue.join()
ไปรองานทั้งหมดเสร็จ
รันไฟล์ด้วยpython3 dispatcher.py
. คุณจะได้รับผลลัพธ์ด้านล่าง:
![](https://post.nghiatu.com/assets/images/m/max/724/1*-NNSlufiaZbdXKAtVsgozQ.png)
รหัสบทความนี้มีอยู่ที่นี่บน Github:
บทสรุป
โดยทั่วไปผู้จัดส่งมีบทบาทสำคัญในการจัดการเหตุการณ์ในระบบตามเหตุการณ์ ช่วยให้มั่นใจได้ว่าเหตุการณ์ได้รับการประมวลผลอย่างมีประสิทธิภาพและถูกต้อง และตัวจัดการเหตุการณ์ได้รับการลงทะเบียนและยกเลิกการลงทะเบียนอย่างถูกต้องตามความจำเป็น
เพียงเท่านี้สำหรับบทความนี้! อย่าลังเลที่จะแสดงความคิดเห็นหรือคำถามในความคิดเห็น หากคุณพบว่าเรื่องนี้น่าอ่าน โปรดปรบมือและติดตาม! ไชโย!