ทางเลือกใหม่ที่สะอาดและมีน้ำหนักเบาสำหรับ Python twisted [ปิด]


222

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 ++ นั้นรหัสที่ใช้เรียกกลับสามารถนำไปสู่การออกแบบที่ยากต่อการติดตามและค่อนข้างคลุมเครือในสายตาที่ไม่ได้รับการฝึกฝน การใช้งานประจำช่วยให้คุณสามารถเขียนรหัสที่ดูน้อยกว่าอย่างน้อย ฉันเดาว่าตอนนี้งานของฉันคือการหาว่าหนึ่งในหลาย ๆ ห้องสมุดที่ฉันชอบหน้าตาและให้ไป! ดีใจที่ฉันถามตอนนี้ ... ]

[แก้ไข: อาจเป็นที่สนใจของใครก็ตามที่ติดตามหรือสะดุดกับคำถามนี้หรือใส่ใจเกี่ยวกับหัวข้อนี้ในแง่ใด: ฉันพบการเขียนที่ยอดเยี่ยมของสถานะปัจจุบันของเครื่องมือที่มีอยู่สำหรับงานนี้]


14
งูหลามเป็น multithreaded มันก็ไม่ได้ช่วยให้สองหัวข้อที่จะเรียกใช้รหัสงูใหญ่พร้อมกัน
intgr

86
ฉันได้เรียนรู้จากคำถามของคุณมากกว่าคำตอบ
เดนิส Otkidach

2
@ Denis: เฮ้ขอบคุณฉันเดา! มีพอยน์เตอร์ที่ดีในการตอบด้วยเช่นกันโดยเฉพาะ intgr ฉันรู้เกี่ยวกับตัวเลือกมากออกมีและผมไม่ได้ต้องการเพียงแค่ตอบเต็มไปด้วยเหล่านั้นดังนั้นฉันคิดว่าฉันต้องการไปที่ปัญหาของการสะกดออกสิ่งที่ฉันรู้ :)
JKP

5
> ตอนนี้ผู้คนดูเหมือนจะชื่นชอบวิธีแก้ปัญหาแบบ Co-กิจวัตรแทนที่จะเป็นเครื่องปฏิกรณ์แบบดั้งเดิม / การติดต่อกลับที่มุ่งเน้นสิ่งนี้ไม่ใช่การเปรียบเทียบที่สมเหตุสมผล "การแก้ปัญหาร่วมตามปกติ" และ "การตอบสนองเชิงเครื่องปฏิกรณ์" เป็นมุมฉาก (เพิกเฉยต่อความจริงที่ว่า Python ไม่มี coroutines) ลองดูที่ InlineCallbacks ของ Twisted เพื่อดูว่าคุณสามารถมีรูปแบบการเขียนโปรแกรมที่คุณชอบได้อย่างไรกับเลเยอร์เครือข่ายที่แข็งแกร่งและเป็นผู้ใหญ่ที่จะไม่เปิดเผยคุณ
Jean-Paul Calderone

2
ประเด็นที่ควรเพิ่ม: 1. ทอร์นาโดทำงานได้ดีบน Windows มันไม่ได้มีประสิทธิภาพและปรับขนาดได้เนื่องจากมันใช้selectสำหรับมัลติเพล็กซิ่ง I / O แต่คุณควรจะสามารถได้รับประสิทธิภาพที่ดีออกมาจากมันกับพายุทอร์นาโด pyuv 2. ขณะนี้มี asyncio ใน Python 3.3+ และ backport trolliusซึ่งอนุญาตให้เรียกใช้แอปพลิเคชัน Tornado ใด ๆ ในลูปเหตุการณ์ (Twisted จะได้รับการสนับสนุนในไม่ช้า)
schlamar

คำตอบ:


28

ฉันชอบโมดูล Python ที่เห็นด้วยซึ่งอาศัย microthreads ของ Stackless Python หรือ Greenlets สำหรับเธรดที่มีน้ำหนักเบา การปิดกั้น I / O เครือข่ายทั้งหมดทำขึ้นแบบอะซิงโครนัสผ่านlibeventลูปเดียวดังนั้นจึงควรมีประสิทธิภาพเกือบเท่ากับเซิร์ฟเวอร์อะซิงโครนัสจริง

ฉันคิดว่ามันคล้ายกับ Eventlet ด้วยวิธีนี้

ข้อเสียคือ API ค่อนข้างแตกต่างจาก Python sockets/ threadingmodules; คุณต้องเขียนแอพพลิเคชั่นของคุณใหม่ (หรือเขียนเลเยอร์ shim ที่ใช้งานได้)

แก้ไข:ดูเหมือนว่ายังมีcogenซึ่งคล้ายกัน แต่ใช้เครื่องกำเนิดไฟฟ้าที่ปรับปรุงแล้วของ Python 2.5 สำหรับ coroutines แทนที่จะเป็น Greenlets ทำให้สะดวกต่อการพกพามากกว่าการใช้งานร่วมกันและทางเลือกอื่น ๆ เครือข่าย I / O ทำได้โดยตรงด้วย epoll / kqueue / iocp


@intgr: ลิงค์ที่ยอดเยี่ยม ฉันเคยเห็นทั้งคู่มาก่อนกาลครั้งหนึ่งนั่นคือสิ่งต่าง ๆ ที่ฉันหวังว่าจะได้เห็นออกมา +1
jkp

3
ดูเหมือนว่าการเห็นพ้องต้องกันเป็นโครงการที่ตายแล้วพร้อมกับการอัปเดตล่าสุดเมื่อสี่ปีที่แล้ว
Gewthen

โปรเจ็กต์นั้นตายแล้ว Hyves!
Bahadir Cambel

1
เกิดขึ้นมากมายตั้งแต่ Python 2.5 asyncio ใน Python 3.5 นั้นยอดเยี่ยม
Joseph Sheedy

99

Twisted มีความซับซ้อนคุณพูดถูก บิดไม่ป่อง

หากคุณดูที่นี่: http://twistedmatrix.com/trac/browser/trunk/twistedคุณจะพบกับชุดโปรโตคอลที่ครอบคลุมและผ่านการทดสอบเป็นอย่างดีของโปรโตคอลจำนวนมากของอินเทอร์เน็ตรวมทั้งรหัสผู้ช่วยในการเขียน และปรับใช้แอปพลิเคชั่นเครือข่ายที่ซับซ้อนมาก ฉันจะไม่สับสนกับความเข้าใจอย่างถ่องแท้

เป็นที่ทราบกันดีว่าเอกสาร Twisted นั้นไม่ได้ใช้งานง่ายที่สุดจากการมองแวบแรกและฉันเชื่อว่าสิ่งนี้จะช่วยลดจำนวนคนโชคร้ายลงได้ แต่ Twisted นั้นน่าทึ่ง (IMHO) ถ้าคุณใส่ในเวลา ฉันทำและมันพิสูจน์แล้วว่าคุ้มค่าและฉันแนะนำให้คนอื่นลองทำเช่นเดียวกัน


4
@clemesha: บางทีคุณอาจจะถูกและมันก็ไม่ได้ bloadted แต่มันรู้สึกเหมือนมีบิตมากเกินไปที่จะทำให้หัวของฉันไปทำอะไรง่าย ๆ ฉันเข้าใจการเขียนโปรแกรม async ฉันได้ทำงานใน C ++ พร้อม boost :: asio ดังนั้นแนวคิดจึงไม่ใช่เรื่องใหม่ แต่ทั้งหมดนี้เป็นชัยชนะที่เต็มไปด้วยการทำสิ่งที่บิดเบี้ยว: มันเป็นโลกใหม่ทั้งหมดเหมือน django สำหรับเว็บ อีกครั้งเมื่อฉันทำสิ่งที่เว็บฉันทำงานกับรหัส WSGI น้ำหนักเบาและเสียบเข้าด้วยกันเฉพาะสิ่งที่ฉันต้องการ ม้าสำหรับหลักสูตรฉันเดา
jkp

7
@clemesha: เอ่อฉันไปอาบน้ำวันนี้เพื่อดู: บิดน้ำหนักใน 20MB! แม้แต่แกนเป็น 12MB .... ถ้านั่นไม่ใช่ป่องผมก็ไม่แน่ใจเหมือนกัน
jkp

29
Twisted API พื้นฐานนั้นค่อนข้างเล็ก (เครื่องปฏิกรณ์รอการตัดบัญชีโปรโตคอล) รหัส Twisted ส่วนใหญ่เป็นการใช้งานโปรโตคอล async โดยใช้พื้นฐานเหล่านั้น "Bloat" ไม่ใช่คำคุณศัพท์ที่มีประโยชน์ที่นี่ (หรือในกรณีส่วนใหญ่) ขนาดของ Twisted นั้นสมเหตุสมผลกับปริมาณของสิ่งของ
daf

56

geventเป็นeventlet ทำความสะอาดขึ้น

API-wise จะปฏิบัติตามอนุสัญญาเช่นเดียวกับไลบรารีมาตรฐาน (โดยเฉพาะโมดูลการทำเกลียวและมัลติโปรเซสเซอร์) ที่เหมาะสม ดังนั้นคุณมีสิ่งที่คุ้นเคยเช่นคิวและกิจกรรมเพื่อทำงานกับ

รองรับเฉพาะlibevent ( update: libev ตั้งแต่ 1.0 ) เป็นการใช้งานเครื่องปฏิกรณ์ แต่ใช้ประโยชน์อย่างเต็มที่จากมันซึ่งมีเซิร์ฟเวอร์ WSGI ที่รวดเร็วโดยใช้ libevent-http และแก้ไขการสืบค้น DNS ผ่าน libevent-dns แทนที่จะใช้เธรดพูลเช่นไลบรารีอื่น ๆ ส่วนใหญ่ ทำ. ( อัปเดต:ตั้งแต่ 1.0 c-ares ใช้ในการสร้าง async DNS เคียวรี threadpool เป็นตัวเลือกเช่นกัน)

เช่นเดียวกับ eventlet ก็จะทำให้การเรียกกลับและ Deferreds ที่ไม่จำเป็นโดยใช้greenlets

ตรวจสอบตัวอย่าง: ดาวน์โหลดพร้อมกันหลาย URL , หน่วยเลือกตั้งยาว webchat


4
ฉันจะตรวจสอบอีกครั้ง - หลังจากตรวจสอบวิธีแก้ปัญหาต่างๆแล้ว gevent ก็ทำงานได้ดีสำหรับฉัน มันทำให้ฉันสามารถรักษาส่วนที่ดีกว่าของโปรแกรมที่มีอยู่ของฉันและการเปลี่ยนแปลงที่จำเป็นต้องมีเล็กน้อย - ดีที่สุดของทั้งหมดถ้ารหัสจะต้องได้รับการบำรุงรักษาในเวลา 3, 4, 5, ... ปีก็ยังคงทำให้ ความรู้สึกกับทุกคนที่ไม่คุ้นเคยกับ gevent, showstopper ที่ใหญ่ที่สุดสำหรับ Twisted เป็นช่วงการเรียนรู้ที่แข็งแกร่งซึ่งทำให้เกิดปัญหาไม่เพียง แต่เมื่อนำไปใช้ แต่ยังไกลลงไประหว่างการบำรุงรักษา ...
Martin Tournoij

27

การเปรียบเทียบกรอบที่น่าสนใจจริงๆนั้นรวบรวมโดย Nicholas Piëlบนบล็อกของเขา: มันคุ้มค่าที่จะอ่าน!


2
ในขณะที่ฉันยอมรับว่าบทความเป็นการอ่านที่น่าสนใจฉันคิดว่ามันคุ้มค่าที่จะพิจารณาความถูกต้องของมาตรฐานที่นำเสนอ ดูความคิดเห็นที่นี่: reddit.com/r/programming/comments/ahepg/…
clemesha

1
@clemesha ในขณะที่จุดในหน้า reddit นั้นน่าสังเกต แต่ก็มีการทำเบนช์มาร์กบนเครื่องดูอัลคอร์และอาจไม่ได้รับความเสียหายจากข้อบกพร่องร้ายแรง ฉันคิดว่าเป็นไปได้ทั้งไคลเอนต์และเซิร์ฟเวอร์ที่ทำงานบนแกนเดียวกัน แต่ดูเหมือนว่าจะไม่
Peter Hansen

15

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


เกิดอะไรขึ้นกับการใช้หลายกระบวนการ
Emil Ivanov

3
ไม่มีอะไรเลยดังนั้นข้อเสนอแนะให้ใช้โมดูลมัลติโปรเซสเซอร์
Adam Hupp

11

ฉันจะไม่ไปไกลถึง Twisted bloated แต่มันยากที่จะคาดศีรษะคุณ ฉันหลีกเลี่ยงการนั่งเรียนรู้อยู่พักหนึ่งเพราะฉันต้องการบางสิ่งที่ง่ายกว่าสำหรับ 'งานเล็ก ๆ '

อย่างไรก็ตามตอนนี้ฉันได้ทำงานกับมันแล้วฉันต้องบอกว่าการมีแบตเตอรี่รวมอยู่ด้วยนั้นดีมาก

ไลบรารี async อื่น ๆ ทั้งหมดที่ฉันได้ทำงานด้วยความเป็นผู้ใหญ่ยังน้อยกว่าที่ปรากฏ เหตุการณ์ของ Twisted นั้นมั่นคง

ฉันไม่แน่ใจว่าจะแก้ปัญหาการเรียนรู้ Twisted ที่สูงชันได้อย่างไร มันอาจช่วยได้ถ้ามีคนแยกและทำความสะอาดสิ่งเล็ก ๆ น้อย ๆ เช่นลบ cruft ความเข้ากันได้ย้อนหลังทั้งหมดและโครงการที่ตายแล้ว แต่นั่นเป็นธรรมชาติของซอฟต์แวร์สำหรับผู้ใหญ่ที่ฉันเดา


หากคุณเคยค้นหาวิธีการใช้เครื่องปฏิกรณ์ gtk ภายใต้ Windows (โพลง่าย ๆ ทุก 10ms: twistedmatrix.com/trac/browser/trunk/twisted/internet/ … ) คุณจะไม่เรียกมันว่า "ผู้ใหญ่" ...
schlamar

2
สวัสดี @schlamar การแฮกที่น่ารังเกียจนี้ถูกนำมาใช้เป็นวิธีแก้ปัญหาสำหรับข้อบกพร่องที่ร้ายแรงบางอย่างใน GTK + ย้อนกลับไปในวันที่มีความกังวลน้อยมากเกี่ยวกับประสิทธิภาพการใช้พลังงาน :) แต่ความสวยงามของ Twisted คือเราสามารถมีบั๊กนี้ได้ครั้งเดียวแก้ไขในกรอบและผู้ใช้ของเราไม่จำเป็นต้องกังวล คุณต้องการมีส่วนร่วมการแก้ไขที่แก้ไขปัญหานี้และกำจัด (เลิกใช้แล้วลบภายหลัง) PortableGtkReactor?
Glyph

1
@ glyph ฉันได้เพิ่มคำแนะนำที่เป็นประโยชน์เกี่ยวกับtwistedmatrix.com/trac/ticket/4744#comment:2หากมีคนอื่นต้องการแก้ไขปัญหานี้เนื่องจากปัญหาบางประการยังคงมีอยู่ BTW คุณสามารถแก้ไขปัญหานี้ได้อย่างมีประสิทธิภาพมากขึ้นโดยการกำหนดเวลาการโทรกลับระหว่างลูปสองเหตุการณ์
schlamar

7

Kamaeliaยังไม่ได้รับการกล่าวถึง รูปแบบการทำงานพร้อมกันของมันขึ้นอยู่กับการเดินสายไฟเข้าด้วยกันส่วนประกอบที่มีข้อความผ่านระหว่างกล่องจดหมายเข้าและขาออก นี่เป็นภาพรวมคร่าวๆ


5
ฉันใช้คามาเลียเป็นแอพ - มันเจ็บปวดมาก IMHO มีอื่น ๆ ตัวเลือกที่ดีกว่าสำหรับ concurrenct ในหลาม (ซึ่งส่วนใหญ่จะกล่าวถึงข้างต้น)
เบนฟอร์ด

7

ฉันเริ่มใช้บิดสำหรับบางสิ่ง ความงามของมันเกือบจะเป็นเพราะมัน "ป่อง" มีตัวเชื่อมต่อสำหรับโปรโตคอลหลัก ๆ คุณสามารถมีบอท jabber ที่จะรับคำสั่งและโพสต์ไปยังเซิร์ฟเวอร์ irc ส่งอีเมลไปยังใครบางคนเรียกใช้คำสั่งอ่านจากเซิร์ฟเวอร์ NNTP และตรวจสอบการเปลี่ยนแปลงหน้าเว็บ ข่าวร้ายคือมันสามารถทำทุกสิ่งและสามารถทำให้สิ่งที่ซับซ้อนมากเกินไปสำหรับงานง่าย ๆ อย่าง OP อธิบาย ข้อดีของงูหลามคือคุณรวมสิ่งที่คุณต้องการเท่านั้น ดังนั้นในขณะที่การดาวน์โหลดอาจมีขนาด 20mb คุณอาจมีเพียง 2mb ของไลบรารี (ซึ่งยังมีจำนวนมาก) ร้องเรียนที่ใหญ่ที่สุดของฉันกับบิดคือแม้ว่าพวกเขาจะมีตัวอย่างอะไรนอกเหนือจากเซิร์ฟเวอร์ tcp ขั้นพื้นฐานที่คุณเอง

ในขณะที่ไม่ใช่วิธีการแก้ปัญหาของงูหลามฉันได้เห็น node.js ได้รับแรงฉุดมากขึ้นในช่วงปลายปี อันที่จริงฉันคิดว่าจะมองหาโครงการขนาดเล็ก แต่ฉันแค่ประจบประแจงเมื่อฉันได้ยินจาวาสคริปต์ :)


ฉันเป็นแฟนงูหลามตัวใหญ่ - ดู "Javascript - ส่วนที่ดี" จาก Douglas Crockford (3, 4 วิดีโอ) และดูที่ CoffeeScript ปรากฎว่า JS มีสิ่งที่ Python ควรจะมียกเว้น Syntax ฮ่าฮ่า CS พยายามที่จะลดความรุนแรง แต่เป็นเงอะงะเล็ก ๆ น้อย ๆ ที่ ...
โรเบิร์ต Siemer

4

มีหนังสือที่ดีเกี่ยวกับเรื่อง: "Twisted Network Programming Essentials" โดย Abe Fettig ตัวอย่างแสดงวิธีการเขียนรหัส Pythonic มากและสำหรับฉันเป็นการส่วนตัวอย่าตีฉันตามกรอบของป่อง ดูวิธีแก้ปัญหาในหนังสือหากพวกเขาไม่สะอาดฉันไม่รู้ว่าหมายถึงอะไรที่สะอาด

ปริศนาเดียวของฉันคือสิ่งที่ฉันมีกับกรอบอื่น ๆ เช่น Ruby ฉันกังวลมันเพิ่มขนาดได้ไหม ฉันเกลียดที่จะมอบความไว้วางใจให้กับลูกค้าในกรอบที่จะมีปัญหาในการปรับขนาดได้


4

Whizzerเป็นกรอบซ็อกเก็ตแบบอะซิงโครนัสขนาดเล็กที่ใช้ pyev มันเร็วมากส่วนใหญ่เป็นเพราะ pyev มันพยายามที่จะให้อินเทอร์เฟซที่คล้ายกันเป็นบิดกับการเปลี่ยนแปลงเล็กน้อย


2

นอกจากนี้ยังพยายามSyncless เป็นแบบ coroutine (ดังนั้นจึงคล้ายกับ Concurrence, Eventlet และ gevent) มันดำเนินการแทนที่แบบ non-block สำหรับ socket.socket, socket.gethostbyname (ฯลฯ ), ssl.SSLSocket, time.sleep และ select.select มันเร็วมาก มันต้องการ Stackless Python และ libevent มันมีนามสกุลหลามบังคับที่เขียนใน C (Pyrex / Cython)


2

ผมยืนยันความดีของsyncless สามารถใช้ libev (เวอร์ชันที่ใหม่กว่าสะอาดขึ้นและมีประสิทธิภาพที่ดีขึ้นของ libevent) บางครั้งที่ผ่านมามันไม่ได้รับการสนับสนุนเท่าที่ libevent มี แต่ตอนนี้กระบวนการพัฒนาดำเนินต่อไปและมีประโยชน์มาก


1

ถ้าคุณแค่ต้องการ HTTP Request Library ที่มีน้ำหนักเบาแบบง่ายฉันก็พบว่าUnirestนั้นดีจริงๆ


0

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

เพียงแค่ปล่อยให้คลาสสืบทอดจาก Task แทนที่จะเป็น object และเป็น async การเรียกใช้เมธอดทั้งหมดเป็น Proxies ค่าส่งคืน (ถ้าคุณต้องการ) คือผู้รับมอบฉันทะในอนาคต

res = obj.method( args )
# code continues here without waiting for method to finish
do_something_else( )
print "Result = %d" % res # Code will block here, if res not calculated yet

PyWorks สามารถพบได้ในhttp://bitbucket.org/raindog/pyworks


1
ในขณะที่สิ่งนี้น่าสนใจและอาจเหมาะสำหรับบางงานการใช้เธรดสำหรับการเชื่อมต่อเครือข่ายมีประสิทธิภาพไม่ดี (โดยเฉพาะกับ Python เนื่องจาก GIL) และนี่คือคำถามที่แน่นอน: เฟรมเวิร์กที่มีเหตุการณ์หรือด้วยมัลติโปรเซสเซอร์ ดังนั้นคำตอบของคุณอย่างชัดเจนออกจากขอบเขต ...
schlamar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.