نظيفة, خفيفة الوزن بديلا بايثون الملتوية ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/1824418

سؤال

A (طويلة) منذ فترة كتبت العنكبوت شبكة الإنترنت أن لا مؤشرات إلى تمكين الطلبات المتزامنة التي تحدث في نفس الوقت.كان ذلك في بيثون الشباب في الأيام قبل أن أعرف عن جيل وما يرتبط بها من مشاكل يخلق مؤشرات رمز (أي أكثر من مرة الأشياء فقط ينتهي تسلسل!)...

أود أن صياغة هذا القانون لجعله أكثر قوة وأداء أفضل.هناك أساسا طريقتان يمكن أن أفعل هذا:يمكنني استخدام جديدة وحدة المعالجة المتعددة في 2.6+ أو أنا يمكن أن تذهب من أجل مفاعل / الحدث القائم على نموذج من نوع ما.وأود أن بدلا من ذلك في وقت لاحق حيث أنها أبسط بكثير وأقل عرضة للخطأ.

لذا فإن السؤال يتعلق ما يكون الإطار الأنسب احتياجات بلدي.التالي هو قائمة من الخيارات أعلم عنها حتى الآن:

  • الملتوية:الجد من بيثون المفاعل الأطر:يبدو معقدة و منتفخة قليلا ولكن.حاد منحنى التعلم صغيرة المهمة.
  • في مدينة باريس:من الرجال في lindenlab.Greenlet على أساس إطار موجهة نحو هذه الأنواع من المهام.كان لي نظرة على مدونة على الرغم من انها ليست جميلة جدا:غير pep8 متوافقة متناثرة مع طباعة (لماذا يفعل الناس هذا في إطار!?), API يبدو قليلا غير متناسقة.
  • PyEv:غير ناضجة, لا يبدو أن يكون أي شخص يستخدم الآن على الرغم من أنه يقوم على libevent حتى انها حصلت على الخلفية الصلبة.
  • asyncore:من stdlib:über على مستوى منخفض ، يبدو مثل الكثير من الأبحاث المعنية فقط للحصول على شيء من الأرض.
  • اعصار:على الرغم من أن هذا هو خادم الموجهة المنتج تهدف إلى ملقم المواقع الحيوية فإنه لا ميزة المتزامن HTTP العميل و بسيط ioloop.يبدو أن الحصول على وظيفة القيام به ولكن ليس هو المقصود.[تحرير:لا تعمل على ويندوز للأسف الذي التهم عنه - لها شرط بالنسبة لي أن دعم هذه عرجاء منصة]

هل هناك شيء فاتني ؟ بالتأكيد يجب أن يكون هناك مكتبة هناك الذي يناسب الحلو بقعة مبسطة المتزامن الشبكات المكتبة!

[تحرير:الشكر الكبير intgr له مؤشر إلى هذه الصفحة.إذا كنت انتقل إلى أسفل سترى هناك لطيفة حقا قائمة من المشاريع التي تهدف إلى معالجة هذه المسألة بطريقة أو بأخرى.يبدو في الواقع أن الأمور في الواقع انتقلت منذ بداية الملتوية:الناس الآن يبدو لصالح شارك في الروتين على أساس حل بدلا من التقليدية المفاعل / رد الموجهة واحد.فوائد هذا النهج أكثر وضوحا وأكثر مباشرة كود:بالتأكيد وجدت في الماضي, لا سيما عند العمل مع دفعة.اسيو في C++ أن رد القائم رمز يمكن أن يؤدي إلى التصاميم التي يمكن أن يكون من الصعب المتابعة و هي غامضة نسبيا للعين غير المدربة.باستخدام co-إجراءات يسمح لك لكتابة التعليمات البرمجية التي تبدو أكثر قليلا متزامن على الأقل.أعتقد الآن مهمتي هي أن ينجح أي واحد من هؤلاء العديد من المكتبات أنا أحب أن ننظر من وإعطائها الذهاب!سعيد سألت الآن...]

[تحرير:ولعل من الفائدة أن كل من تابع أو عثر على هذا السؤال أو يهتم هذا الموضوع في أي معنى:وجدت حقا رائعة writeup من الوضع الحالي الأدوات المتاحة هذا العمل]

هل كانت مفيدة؟

المحلول

اعجبني موافقة بيثون وحدة الذي يعتمد على إما Stackless الثعبان microthreads أو Greenlets خفيفة الوزن خيوط.كل حجب شبكة I/O هو بشفافية إجراء غير متزامن من خلال واحدة libevent حلقة ، لذلك يجب أن يكون ما يقرب من كفاءة الحقيقي غير متزامن الخادم.

اعتقد انها مشابهة في مدينة باريس في هذا السبيل.

الجانب السلبي هو أن API يختلف تماما عن بايثون sockets/threading وحدات ، تحتاج إلى إعادة كتابة عادلة قليلا من التطبيق الخاص بك (أو كتابة التوافق شيم طبقة)

تحرير: يبدو أن هناك أيضا cogen, والتي هي مشابهة ، ولكن تستخدم بايثون 2.5 هو تعزيز مولدات عن coroutines بدلا من Greenlets.هذا يجعل الأمر أكثر المحمولة من موافقة وغيرها من البدائل.شبكة I/O يتم مباشرة مع epoll/وkqueue/iocp.

نصائح أخرى

الملتوية المعقدة ، أنت على حق في ذلك.الملتوية هو لا المتضخمة.

إذا كنت نلقي نظرة هنا: http://twistedmatrix.com/trac/browser/trunk/twisted ستجد منظمة وشاملة بشكل جيد جدا اختبار جناح العديد من بروتوكولات الإنترنت ، وكذلك مساعد رمز لكتابة ونشر متطورة جدا في تطبيقات الشبكة.لا تخلط بين انفخ مع الشمولية.

من المعروف أن الملتوية الوثائق ليست الأكثر استعمالا من أول وهلة ، وأعتقد أن هذا يبتعد مؤسفة عدد من الناس.ولكن الملتوية هو مدهش (IMHO) إذا وضعت في ذلك الوقت.لم و ثبت أن يستحق ذلك, و أود أن أوصى إلى الآخرين في محاولة نفسه.

gevent هو في مدينة باريس تنظيف.

API-الحكمة أنه يتبع نفس الاتفاقيات المكتبة القياسية (على وجه الخصوص ، خيوط و وحدات المعالجة المتعددة) حيث أنه من المنطقي.بحيث يكون لديك أشياء مألوفة مثل الانتظار و الحدث للعمل مع.

يدعم فقط libevent (تحديث: libev منذ 1.0) كما المفاعل التنفيذ ولكن يأخذ الاستفادة الكاملة من ذلك ، يتميز بسرعة WSGI الخادم على أساس libevent-http وحل استعلامات DNS من خلال libevent-dns بدلا من استخدام حمام السباحة موضوع مثل معظم المكتبات الأخرى القيام به.(تحديث: منذ 1.0 ج-آريس هو المتزامن DNS استعلامات.threadpool هو أيضا خيار.)

مثل مدينة باريس ، فإنه يجعل الاسترجاعات Deferreds غير الضرورية باستخدام greenlets.

تحقق من الأمثلة: المتزامنة تحميل من عناوين متعددة, الاقتراع طويلة الحوار الإلكتروني.

حقا مقارنة مثيرة للاهتمام هذه الأطر التي جمعتها نيكولاس Piël على مدونته:انها تستحق القراءة!

أيا من هذه الحلول تجنب حقيقة أن جيل يمنع وحدة المعالجة المركزية التوازي - هم فقط أفضل الطرق للحصول على IO التوازي التي لديك بالفعل مع المواضيع.إذا كنت تعتقد أنك يمكن أن تفعل أفضل IO, بكل الوسائل في متابعة واحدة من هذه, ولكن إذا كان لديك عنق الزجاجة في معالجة النتائج لا شيء هنا سوف تساعد باستثناء وحدة المعالجة المتعددة.

لن تذهب إلى حد الدعوة الملتوية المتضخمة ، ولكن من الصعب أن التفاف حول رأسك.لقد تجنبت حقا تسوية في تعلم لفترة طويلة كما أردت دائما شيء أسهل قليلا 'المهام الصغيرة'.

ولكن الآن بعد أن عملت مع بعض أكثر من ذلك يجب أن أقول بعد كل البطاريات وشملت هو لطيف جدا.

جميع المتزامن المكتبات لقد عملت مع نهاية يكون أقل نضجا من هم حتى تظهر.الملتوية الحدث حلقة صلبة.

أنا لست متأكدا تماما كيفية حل حاد الملتوية منحنى التعلم.فإنه قد يساعد إذا كان شخص ما من شأنه شوكة و تنظيف بعض الأشياء مثل إزالة جميع الوراء التوافق الغبار المتراكم تحت السرير و الأموات المشاريع.ولكن هذه هي طبيعة البرامج ناضجة أعتقد.

Kamaelia لم تذكر حتى الآن.لها التزامن نموذج يستند إلى الأسلاك معا المكونات مع تمرير الرسائل بين الوارد و outboxes. هنا's لمحة موجزة.

لقد بدأت في استخدام الملتوية لبعض الأشياء.الجمال هو تقريبا لأنه "المتضخمة." هناك موصلات فقط حول أي من البروتوكولات الرئيسية هناك.هل يمكن أن يكون جابر بوت من شأنها أن تأخذ الأوامر وآخر إلى خادم irc, إرسالها بالبريد الإلكتروني إلى شخص ما ، قم بتشغيل الأمر قراءة من ملقم NNTP, ورصد صفحة ويب لإجراء تغييرات.الأخبار السيئة هي أنه يمكن أن تفعل كل هذا و يمكن أن تجعل الأمور معقدة أكثر من اللازم مهام بسيطة مثل المرجع أوضح.الاستفادة من بيثون على الرغم من أنك تشمل فقط ما تحتاجه.ذلك في حين أن التحميل قد يكون 20mb ، قد تشمل فقط 2mb المكتبات (والتي لا يزال الكثير).أكبر شكواي مع الملتوية هو على الرغم من أنها تشمل الأمثلة ، أي شيء خارج الأساسية tcp خادم أنت بنفسك.

في حين لا بيثون الحل رأيت node.js كسب الكثير من الجر اعتبارا من أواخر.في الواقع لقد فكرت أبحث في الأمر للمشاريع الصغيرة ولكن أنا فقط تذلل عندما أسمع جافا سكريبت :)

هناك كتاب جيد في هذا الموضوع:"الملتوية شبكة أساسيات البرمجة" ، ابي Fettig.الأمثلة التي تظهر كيفية كتابة جدا Pythonic رمز, و بالنسبة لي شخصيا, لا يبدو لي على أساس المتضخمة الإطار.والنظر في الحلول في الكتاب ، إذا لم تكن نظيفة ، ثم لا أدري ماذا نظيفة يعني.

بلدي فقط لغز هو نفس علي مع أطر أخرى ، مثل روبي.لا تقلق, هل هذا مقياس ؟ أكره أن ارتكاب عميل إطار ستكون لدينا قابلية المشاكل.

Whizzer هو صغير غير متزامن مأخذ الإطار الذي يستخدم pyev.سريع جدا في المقام الأول بسبب pyev.فإنه يحاول تقديم مشابهة واجهة الملتوية مع بعض التغييرات الطفيفة.

أيضا محاولة Syncless.إنه coroutine القائم (حتى انها مماثلة موافقة مدينة باريس و gevent).وتنفذ قطرة في عدم عرقلة استبدال المقبس.مأخذ مأخذ.gethostbyname (الخ) ، ssl.SSLSocket الوقت.النوم وحدد.حدد.انها سريعة.فإنه يحتاج Stackless الثعبان libevent.أنه يحتوي على إلزامية الثعبان امتداد مكتوب في C (بيركس/Cython).

أؤكد الخير syncless.فإنه يمكن استخدام libev (أحدث وأنظف وأفضل أداء نسخة من libevent).بعض مرات قبل لا له كما libevent لكن الآن عملية التنمية تذهب أبعد من ذلك و هو مفيد جدا.

إذا كنت ترغب فقط في مبسطة وخفيفة الوزن طلب HTTP المكتبة ثم أجد Unirest حقا جيدة

أنتم مدعوون إلى إلقاء نظرة على PyWorks الذي يأخذ مختلفة تماما النهج.فإنه يتيح تشغيل مثيلات الكائن في موضوع خاص بها و يجعل وظيفة الدعوة إلى هذا الكائن المتزامن.

فقط اسمحوا فئة ترث من المهمة بدلا من الكائن و هو المتزامن, جميع طرق المكالمات الوكلاء.عودة القيم (إذا كنت في حاجة إليها) هي المستقبل الوكلاء.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top