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