แพ็คเกจ PyPI
ตั้งแต่เดือนมิถุนายน 2563 แพ็คเกจเหล่านี้เป็นแพคเกจที่เกี่ยวข้องกับเหตุการณ์ที่มีใน PyPI เรียงตามวันที่วางจำหน่ายล่าสุด
ยังมีอีก
มีไลบรารีให้เลือกมากมายโดยใช้คำศัพท์ที่แตกต่างกันมาก (เหตุการณ์, สัญญาณ, ตัวจัดการ, การจัดส่งเมธอด, hooks, ... )
ฉันกำลังพยายามเก็บภาพรวมของแพ็คเกจข้างต้นรวมถึงเทคนิคต่าง ๆ ที่กล่าวถึงในคำตอบที่นี่
ก่อนอื่นมีคำศัพท์บางคำ ...
รูปแบบการสังเกตการณ์
รูปแบบพื้นฐานที่สุดของระบบเหตุการณ์คือ 'วิธีการจัดการถุง' ซึ่งเป็นการใช้งานอย่างง่ายของรูปแบบการสังเกตการณ์รูปแบบการสังเกตการณ์
โดยทั่วไปวิธีการจัดการ (callables) จะถูกเก็บไว้ในอาร์เรย์และแต่ละคนจะเรียกว่าเมื่อเหตุการณ์ 'ไฟ'
เผยแพร่-สมัครสมาชิก
ข้อเสียของระบบเหตุการณ์ Observer คือคุณสามารถลงทะเบียนตัวจัดการบนวัตถุเหตุการณ์จริง (หรือรายการตัวจัดการ) เท่านั้น ดังนั้นในเวลาลงทะเบียนเหตุการณ์จำเป็นต้องมีอยู่แล้ว
นั่นเป็นเหตุผลที่รูปแบบที่สองของระบบการจัดกิจกรรมที่มีอยู่ที่:
เผยแพร่สมัครรูปแบบ ที่นี่ตัวจัดการไม่ได้ลงทะเบียนในวัตถุเหตุการณ์ (หรือรายการตัวจัดการ) แต่อยู่ในโปรแกรมเลือกจ่ายส่วนกลาง นอกจากนี้ตัวแจ้งเตือนจะคุยกับดิสแพตเชอร์เท่านั้น สิ่งที่จะฟังหรือสิ่งที่จะเผยแพร่จะพิจารณาจาก 'สัญญาณ' ซึ่งไม่มีอะไรมากไปกว่าชื่อ (สตริง)
รูปแบบคนกลาง
อาจจะเป็นที่น่าสนใจเช่นกันคือรูปแบบการไกล่เกลี่ย
ตะขอ
ระบบ 'hook' ถูกใช้ในบริบทของปลั๊กอินแอปพลิเคชัน แอปพลิเคชันมีจุดรวมการแก้ไข (hooks) และแต่ละปลั๊กอินอาจเชื่อมต่อกับ hook นั้นและดำเนินการบางอย่าง
'กิจกรรม' อื่น ๆ
หมายเหตุ: เธรด.เหตุการณ์ไม่ใช่ 'ระบบเหตุการณ์' ในแง่ข้างต้น เป็นระบบการซิงโครไนซ์เธรดที่เธรดหนึ่งรอจนกระทั่งเธรด 'สัญญาณ' อื่น ๆ ของวัตถุเหตุการณ์
ไลบรารีข้อความเครือข่ายมักใช้คำว่า 'events' ด้วยเช่นกัน บางครั้งสิ่งเหล่านี้คล้ายกันในแนวคิด บางครั้งไม่ พวกเขาสามารถข้ามเส้นเขตแดนกระบวนการและขอบเขตของคอมพิวเตอร์ได้ ดูเช่น
pyzmq , pymq ,
บิด , ทอร์นาโด , gevent , eventlet
ข้อมูลอ้างอิงที่อ่อนแอ
ใน Python การอ้างอิงถึงเมธอดหรือวัตถุทำให้มั่นใจได้ว่าจะไม่ถูกลบโดยตัวเก็บขยะ สิ่งนี้สามารถเป็นที่ต้องการได้ แต่มันยังสามารถนำไปสู่การรั่วไหลของหน่วยความจำ: ตัวจัดการที่เชื่อมโยงจะไม่ทำความสะอาด
ระบบเหตุการณ์บางระบบใช้การอ้างอิงที่อ่อนแอแทนระบบปกติเพื่อแก้ปัญหานี้
บางคำเกี่ยวกับห้องสมุดต่างๆ
ระบบเหตุการณ์สไตล์ผู้สังเกตการณ์:
- zope.eventแสดงให้เห็นถึงกระดูกที่เปลือยเปล่าของวิธีการทำงานนี้ (ดูคำตอบของ Lennart ) หมายเหตุ: ตัวอย่างนี้ไม่สนับสนุนอาร์กิวเมนต์ตัวจัดการ
- LongPoke ของ 'รายการ callable'แสดงให้เห็นว่าการดำเนินงานระบบดังกล่าวเหตุการณ์ที่สามารถดำเนินการได้มาก minimalistically โดย
list
subclassing
- EventHook การเปลี่ยนแปลงของFelkยังช่วยให้แน่ใจว่าลายเซ็นของ callees และผู้โทร
- spasig's EventHook (รูปแบบเหตุการณ์ของ Michael Foord) เป็นการใช้งานที่ไม่ซับซ้อน
- คลาสของบทเรียนที่มีค่าของ Josipนั้นเหมือนกัน แต่ใช้
set
แทน a list
เพื่อเก็บกระเป๋าและนำไปใช้__call__
ซึ่งเป็นส่วนเพิ่มเติมที่สมเหตุสมผล
- PyNotifyคล้ายกันในแนวคิดและยังให้แนวคิดเพิ่มเติมเกี่ยวกับตัวแปรและเงื่อนไข ('เหตุการณ์ที่เปลี่ยนแปลงของตัวแปร') โฮมเพจไม่ทำงาน
- Axelนั้นเป็น bag-of-hander ที่มีคุณสมบัติเพิ่มเติมที่เกี่ยวข้องกับเธรด, การจัดการข้อผิดพลาด, ...
- หลามจัดส่ง
pydispatch.Dispatcher
ต้องเรียนแหล่งที่มาแม้จะได้รับจาก
- Buslaneเป็นแบบพื้นฐานรองรับการจัดการเดี่ยวหรือหลายและอำนวยความสะดวกคำแนะนำประเภทที่กว้างขวาง
- ผู้สังเกตการณ์ / เหตุการณ์ของ Pithikos คือการออกแบบที่มีน้ำหนักเบา
ไลบรารีที่เผยแพร่โดยสมัครสมาชิก:
- ไฟกระพริบมีคุณสมบัติที่ดีบางอย่างเช่นการตัดการเชื่อมต่ออัตโนมัติและการกรองตามผู้ส่ง
- PyPubSubเป็นแพคเกจที่เสถียรและสัญญาว่า "คุณสมบัติขั้นสูงที่อำนวยความสะดวกในการดีบักและบำรุงรักษาหัวข้อและข้อความ"
- pymitterเป็นพอร์ต Python ของ Node.js EventEmitter2 และนำเสนอเนมสเปซไวด์การ์ดและ TTL
- PyDispatcherดูเหมือนว่าจะเน้นความยืดหยุ่นโดยคำนึงถึงสิ่งพิมพ์หลายต่อหลายเรื่องและอื่น ๆ รองรับการอ้างอิงที่อ่อนแอ
- Louieเป็น PyDispatcher ที่นำกลับมาทำใหม่และควรทำงาน "ในบริบทที่หลากหลาย"
- pypydispatcherขึ้นอยู่กับ (คุณเดาได้ว่า ... ) PyDispatcher และทำงานใน PyPy
- django.dispatchเป็น PyDispatcher ที่เขียนใหม่ "พร้อมกับอินเทอร์เฟซที่ จำกัด แต่มีประสิทธิภาพสูงกว่า"
- pyeventdispatcherขึ้นอยู่กับเฟรมเวิร์กของผู้จัดทำ Symfony ของ PHP
- โปรแกรมเลือกจ่ายงานถูกดึงมาจาก django.dispatch แต่ได้รับความเก่า
- EventMangerของ Cristian Garcia นั้นเป็นการใช้งานที่สั้นมาก
อื่น ๆ :
- pluggyมีระบบ hook ซึ่งใช้โดย
pytest
ปลั๊กอิน
- RxPy3ใช้รูปแบบที่สังเกตได้และอนุญาตให้รวมเหตุการณ์ลองใหม่อีกครั้ง
- สัญญาณ Qt และสล็อตที่มีอยู่จากPyQt
หรือPySide2 พวกเขาทำงานเป็นโทรกลับเมื่อใช้ในเธรดเดียวกันหรือเป็นเหตุการณ์ (ใช้วนรอบเหตุการณ์) ระหว่างสองกระทู้ที่แตกต่างกัน สัญญาณและช่องมีข้อ จำกัด ที่พวกเขาทำงานในวัตถุของคลาสที่ได้รับมา
QObject
เท่านั้น