การเขียนโปรแกรมตามเหตุการณ์

การเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์จะเน้นที่เหตุการณ์ ในที่สุดขั้นตอนของโปรแกรมขึ้นอยู่กับเหตุการณ์ จนถึงตอนนี้เรากำลังจัดการกับโมเดลการดำเนินการตามลำดับหรือแบบขนาน แต่โมเดลที่มีแนวคิดของการเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์เรียกว่าโมเดลอะซิงโครนัส การเขียนโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์ขึ้นอยู่กับลูปเหตุการณ์ที่มักจะรับฟังเหตุการณ์ที่เข้ามาใหม่ การทำงานของโปรแกรมที่ขับเคลื่อนด้วยเหตุการณ์จะขึ้นอยู่กับเหตุการณ์ เมื่อเหตุการณ์เกิดขึ้นแล้วเหตุการณ์จะตัดสินใจว่าจะดำเนินการอย่างไรและเรียงลำดับอะไร การทำตามผังงานจะช่วยให้คุณเข้าใจวิธีการทำงาน -

โมดูล Python - Asyncio

โมดูล Asyncio ถูกเพิ่มใน Python 3.4 และมีโครงสร้างพื้นฐานสำหรับการเขียนโค้ด single-threaded พร้อมกันโดยใช้ co-Routines ต่อไปนี้เป็นแนวคิดต่างๆที่ใช้โดยโมดูล Asyncio -

วนซ้ำเหตุการณ์

Event-loop คือฟังก์ชันที่ใช้จัดการเหตุการณ์ทั้งหมดในรหัสการคำนวณ มันทำหน้าที่รอบ ๆ ระหว่างการดำเนินการของโปรแกรมทั้งหมดและติดตามเหตุการณ์ที่เข้ามาและการดำเนินการของเหตุการณ์ โมดูล Asyncio อนุญาตให้มีการวนซ้ำเหตุการณ์เดียวต่อกระบวนการ ต่อไปนี้เป็นวิธีการบางอย่างที่จัดเตรียมโดยโมดูล Asyncio เพื่อจัดการเหตุการณ์วนรอบ -

  • loop = get_event_loop() - วิธีนี้จะจัดเตรียมลูปเหตุการณ์สำหรับบริบทปัจจุบัน

  • loop.call_later(time_delay,callback,argument) - วิธีนี้จัดเตรียมการโทรกลับที่จะถูกเรียกหลังจากวินาที time_delay ที่กำหนด

  • loop.call_soon(callback,argument)- วิธีนี้จัดเตรียมการโทรกลับที่จะโทรกลับโดยเร็วที่สุด การเรียกกลับถูกเรียกหลังจาก call_soon () ส่งคืนและเมื่อตัวควบคุมกลับไปที่ลูปเหตุการณ์

  • loop.time() - วิธีนี้ใช้เพื่อคืนเวลาปัจจุบันตามนาฬิกาภายในของลูปเหตุการณ์

  • asyncio.set_event_loop() - วิธีนี้จะตั้งค่าการวนซ้ำเหตุการณ์สำหรับบริบทปัจจุบันเป็นลูป

  • asyncio.new_event_loop() - วิธีนี้จะสร้างและส่งคืนอ็อบเจกต์วนซ้ำเหตุการณ์ใหม่

  • loop.run_forever() - เมธอดนี้จะทำงานจนกว่าจะมีการเรียกเมธอด stop ()

ตัวอย่าง

ตัวอย่างเหตุการณ์ต่อไปนี้ช่วยในการพิมพ์ hello worldโดยใช้เมธอด get_event_loop () ตัวอย่างนี้นำมาจากเอกสารทางการของ Python

import asyncio

def hello_world(loop):
   print('Hello World')
   loop.stop()

loop = asyncio.get_event_loop()

loop.call_soon(hello_world, loop)

loop.run_forever()
loop.close()

เอาต์พุต

Hello World

ฟิวเจอร์ส

สิ่งนี้เข้ากันได้กับคลาส concurrent.futures.Future ที่แสดงถึงการคำนวณที่ยังไม่สำเร็จ มีความแตกต่างดังต่อไปนี้ระหว่าง asyncio.futures.Future และ concurrent.futures.Future -

  • วิธี result () และข้อยกเว้น () จะไม่ใช้อาร์กิวเมนต์การหมดเวลาและเพิ่มข้อยกเว้นเมื่อยังไม่เสร็จสิ้นในอนาคต

  • การโทรกลับที่ลงทะเบียนด้วย add_done_callback () จะถูกเรียกผ่าน call_soon () ของลูปเหตุการณ์เสมอ

  • asyncio.futures คลาสในอนาคตเข้ากันไม่ได้กับฟังก์ชัน wait () และ as_completed () ในแพ็กเกจ concurrent.futures

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างที่จะช่วยให้คุณเข้าใจวิธีใช้คลาส asyncio.futures.future

import asyncio

async def Myoperation(future):
   await asyncio.sleep(2)
   future.set_result('Future Completed')

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(Myoperation(future))
try:
   loop.run_until_complete(future)
   print(future.result())
finally:
   loop.close()

เอาต์พุต

Future Completed

โครูทีน

แนวคิดของโครูทีนใน Asyncio นั้นคล้ายคลึงกับแนวคิดของอ็อบเจ็กต์เธรดมาตรฐานภายใต้โมดูลเธรด นี่คือลักษณะทั่วไปของแนวคิดรูทีนย่อย โครูทีนสามารถถูกระงับในระหว่างการดำเนินการเพื่อรอการประมวลผลภายนอกและส่งกลับจากจุดที่หยุดเมื่อการประมวลผลภายนอกเสร็จสิ้น สองวิธีต่อไปนี้ช่วยเราในการนำโครูทีนไปใช้ -

ฟังก์ชัน async def ()

นี่เป็นวิธีการใช้โครูทีนภายใต้โมดูล Asyncio ต่อไปนี้เป็นสคริปต์ Python สำหรับสิ่งเดียวกัน -

import asyncio

async def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

เอาต์พุต

First Coroutine

@ asyncio.coroutine มัณฑนากร

อีกวิธีในการใช้โครูทีนคือการใช้เครื่องกำเนิดไฟฟ้ากับมัณฑนากร @ asyncio.coroutine ต่อไปนี้เป็นสคริปต์ Python สำหรับสิ่งเดียวกัน -

import asyncio

@asyncio.coroutine
def Myoperation():
   print("First Coroutine")

loop = asyncio.get_event_loop()
try:
   loop.run_until_complete(Myoperation())

finally:
   loop.close()

เอาต์พุต

First Coroutine

งาน

คลาสย่อยของโมดูล Asyncio นี้รับผิดชอบในการดำเนินการโครูทีนภายในลูปเหตุการณ์ในลักษณะคู่ขนาน ต่อไปนี้สคริปต์ Python เป็นตัวอย่างของการประมวลผลงานบางอย่างพร้อมกัน

import asyncio
import time
async def Task_ex(n):
   time.sleep(1)
   print("Processing {}".format(n))
async def Generator_task():
   for i in range(10):
      asyncio.ensure_future(Task_ex(i))
   int("Tasks Completed")
   asyncio.sleep(2)

loop = asyncio.get_event_loop()
loop.run_until_complete(Generator_task())
loop.close()

เอาต์พุต

Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9

ขนส่ง

โมดูล Asyncio มีคลาสการขนส่งสำหรับการใช้งานการสื่อสารประเภทต่างๆ คลาสเหล่านี้ไม่ใช่เธรดที่ปลอดภัยและจะจับคู่กับอินสแตนซ์โปรโตคอลเสมอหลังจากสร้างช่องทางการสื่อสาร

ต่อไปนี้เป็นประเภทของการขนส่งที่แตกต่างกันซึ่งสืบทอดมาจาก BaseTransport -

  • ReadTransport - นี่คืออินเทอร์เฟซสำหรับการขนส่งแบบอ่านอย่างเดียว

  • WriteTransport - นี่คืออินเทอร์เฟซสำหรับการขนส่งแบบเขียนอย่างเดียว

  • DatagramTransport - นี่คืออินเทอร์เฟซสำหรับการส่งข้อมูล

  • BaseSubprocessTransport - คล้ายกับคลาส BaseTransport

ต่อไปนี้เป็นวิธีการที่แตกต่างกันห้าวิธีของคลาส BaseTransport ซึ่งจะเกิดขึ้นชั่วคราวในเวลาต่อมาในประเภทการขนส่งทั้งสี่ประเภท -

  • close() - ปิดการขนส่ง

  • is_closing() - วิธีนี้จะคืนค่าเป็นจริงหากการขนส่งปิดหรือปิดไปแล้วการขนส่ง

  • get_extra_info(name, default = none) - ข้อมูลนี้จะให้ข้อมูลเพิ่มเติมเกี่ยวกับการขนส่ง

  • get_protocol() - วิธีนี้จะส่งคืนโปรโตคอลปัจจุบัน

โปรโตคอล

โมดูล Asyncio มีคลาสพื้นฐานที่คุณสามารถคลาสย่อยเพื่อใช้โปรโตคอลเครือข่ายของคุณ คลาสเหล่านี้ใช้ร่วมกับการขนส่ง โปรโตคอลจะแยกวิเคราะห์ข้อมูลขาเข้าและขอให้เขียนข้อมูลขาออกในขณะที่การขนส่งมีหน้าที่รับผิดชอบ I / O และการบัฟเฟอร์จริง ต่อไปนี้เป็นสามชั้นของโปรโตคอล -

  • Protocol - นี่คือคลาสพื้นฐานสำหรับการนำโปรโตคอลการสตรีมไปใช้กับการขนส่ง TCP และ SSL

  • DatagramProtocol - นี่คือคลาสพื้นฐานสำหรับการนำโปรโตคอลดาตาแกรมไปใช้กับการขนส่ง UDP ..

  • SubprocessProtocol - นี่คือคลาสพื้นฐานสำหรับการใช้โปรโตคอลที่สื่อสารกับโปรเซสลูกผ่านชุดของท่อทิศทางเดียว