A (ยาว) เมื่อก่อนฉันเขียน web-spider ที่ฉันมัลติเธรดเพื่อเปิดใช้งานการร้องขอที่เกิดขึ้นพร้อมกันในเวลาเดียวกัน ที่อยู่ใน Python เยาวชนของฉันในวันก่อนที่ฉันรู้เกี่ยวกับGILและ woes ที่เกี่ยวข้องมันสร้างรหัส multithreaded (IE ส่วนใหญ่สิ่งที่เพิ่งจบอนุกรม!) ...
ฉันต้องการทำงานซ้ำรหัสนี้เพื่อให้มีประสิทธิภาพมากขึ้นและทำงานได้ดีขึ้น โดยทั่วไปมีสองวิธีที่ฉันสามารถทำได้: ฉันสามารถใช้โมดูลมัลติโพรเซสซิงใหม่ใน 2.6+ หรือฉันสามารถใช้เครื่องปฏิกรณ์ / แบบจำลองเหตุการณ์ตามประเภทของบางอย่าง ฉันอยากจะทำในภายหลังเพราะมันง่ายกว่าและมีข้อผิดพลาดน้อยกว่า
ดังนั้นคำถามที่เกี่ยวข้องกับกรอบที่จะเหมาะที่สุดกับความต้องการของฉัน ต่อไปนี้เป็นรายการตัวเลือกที่ฉันรู้เกี่ยวกับ:
- Twisted : ปู่ย่าตายายของกรอบเครื่องปฏิกรณ์ Python: ดูเหมือนซับซ้อนและป่องเล็กน้อย โค้งการเรียนรู้ที่สูงชันสำหรับงานเล็ก ๆ
- Eventlet : จากคนที่lindenlab เฟรมเวิร์กที่เป็นมิตรกับสิ่งแวดล้อมที่มุ่งไปที่งานประเภทนี้ ฉันได้ดูรหัสแล้วและมันก็ไม่สวยเกินไป: ไม่สอดคล้องกับ pep8, กระจัดกระจายไปด้วยภาพพิมพ์ (ทำไมผู้คนถึงทำแบบนี้ในกรอบ!?) API ดูเหมือนจะไม่สอดคล้องกันเล็กน้อย
- PyEv : ยังไม่บรรลุนิติภาวะดูเหมือนจะไม่เป็นใครก็ตามที่ใช้มันในขณะนี้แม้ว่ามันจะอิงกับ libevent ดังนั้นมันจึงมีแบ็กเอนด์ที่มั่นคง
- asyncore : จาก stdlib: überระดับต่ำ, ดูเหมือนว่ามีสิ่งที่ต้องทำมากมายที่เกี่ยวข้อง
- พายุทอร์นาโด : แม้ว่านี้เป็นผลิตภัณฑ์เซิร์ฟเวอร์ที่มุ่งเน้นการออกแบบเพื่อให้เว็บไซต์แบบไดนามิกเซิร์ฟเวอร์มันจะมีลักษณะลูกค้า async HTTPและง่ายioloop ดูเหมือนว่าจะสามารถทำงานให้เสร็จได้ แต่ไม่ใช่สิ่งที่ตั้งใจไว้ [แก้ไข: ไม่ได้ทำงานบน Windows โชคไม่ดีที่นับมันออกมาให้ฉัน - มันเป็นข้อกำหนดสำหรับฉันที่จะสนับสนุนแพลตฟอร์มอ่อนแอนี้]
มีอะไรที่ฉันพลาดไปบ้างไหม? แน่นอนว่าจะต้องมีห้องสมุดออกมาที่เหมาะกับจุดหวานของห้องสมุดเครือข่าย async ที่เรียบง่าย!
[แก้ไข: ใหญ่ขอบคุณintgrสำหรับตัวชี้ของเขามาที่หน้านี้ หากคุณเลื่อนไปที่ด้านล่างคุณจะเห็นว่ามีรายชื่อที่ดีมากของโครงการที่มุ่งจัดการกับงานนี้ไม่ทางใดก็ทางหนึ่ง ดูเหมือนจริง ๆ แล้วว่าสิ่งต่าง ๆ ได้ดำเนินไปอย่างต่อเนื่องตั้งแต่เริ่มต้นของ Twisted: ตอนนี้ผู้คนดูเหมือนจะชื่นชอบวิธีแก้ปัญหาแบบco-กิจวัตรประจำวันมากกว่าที่จะเป็นเครื่องปฏิกรณ์แบบดั้งเดิม / การติดต่อกลับ ประโยชน์ของวิธีนี้คือรหัสที่ชัดเจนยิ่งขึ้น: ฉันเคยพบมาแล้วในอดีตโดยเฉพาะเมื่อทำงานกับboost.asioใน C ++ นั้นรหัสที่ใช้เรียกกลับสามารถนำไปสู่การออกแบบที่ยากต่อการติดตามและค่อนข้างคลุมเครือในสายตาที่ไม่ได้รับการฝึกฝน การใช้งานประจำช่วยให้คุณสามารถเขียนรหัสที่ดูน้อยกว่าอย่างน้อย ฉันเดาว่าตอนนี้งานของฉันคือการหาว่าหนึ่งในหลาย ๆ ห้องสมุดที่ฉันชอบหน้าตาและให้ไป! ดีใจที่ฉันถามตอนนี้ ... ]
[แก้ไข: อาจเป็นที่สนใจของใครก็ตามที่ติดตามหรือสะดุดกับคำถามนี้หรือใส่ใจเกี่ยวกับหัวข้อนี้ในแง่ใด: ฉันพบการเขียนที่ยอดเยี่ยมของสถานะปัจจุบันของเครื่องมือที่มีอยู่สำหรับงานนี้]
select
สำหรับมัลติเพล็กซิ่ง I / O แต่คุณควรจะสามารถได้รับประสิทธิภาพที่ดีออกมาจากมันกับพายุทอร์นาโด pyuv 2. ขณะนี้มี asyncio ใน Python 3.3+ และ backport trolliusซึ่งอนุญาตให้เรียกใช้แอปพลิเคชัน Tornado ใด ๆ ในลูปเหตุการณ์ (Twisted จะได้รับการสนับสนุนในไม่ช้า)