Python مترجم العالمي قفل (جيل) الحل متعدد النظم الأساسية باستخدام taskset على لينكس ؟

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

سؤال

لذلك أنا انتهيت للتو من مشاهدة هذا الحديث على الثعبان مترجم العالمي قفل (جيل) http://blip.tv/file/2232410.

وجوهر ذلك هو أن جيل جيد جدا تصميم واحد النظم الأساسية (الثعبان أساسا يترك التعامل مع الموضوع/جدولة ما يصل إلى نظام التشغيل).ولكن هذا خطير يمكن أن تأتي بنتائج عكسية على متعدد النظم الأساسية و كنت في نهاية المطاف مع IO المواضيع بشكل مكثف من حظره من قبل وحدة المعالجة المركزية مكثفة المواضيع حساب سياق التحول ctrl-C المشكلة[*] وهلم جرا.

لذلك منذ جيل يحد لنا في الأساس تنفيذ برنامج بيثون على وحدة المعالجة المركزية واحدة فكرتي لماذا لم يقبل هذا ببساطة استخدام taskset على لينكس لضبط تقارب من برنامج معين الأساسية/وحدة المعالجة المركزية على النظام (وخاصة في الحالة مع عدة تطبيقات بايثون تعمل على معالج متعدد النواة نظام)?

حتى في نهاية المطاف سؤالي هو:وقد حاول أي شخص باستخدام taskset على لينكس مع بيثون التطبيقات (خصوصا عند تشغيل تطبيقات متعددة على نظام لينكس بحيث متعددة النوى يمكن استخدامها مع واحد أو اثنين من التطبيقات الثعبان ملزمة محددة core) وإذا ما كانت النتائج ؟ هل يستحق به ؟ لا تجعل الأمور أسوأ بالنسبة لبعض أعباء العمل?أخطط للقيام بذلك واختبار بها (راجع في الأساس إذا كان البرنامج يأخذ أكثر أو أقل وقت تشغيل) ولكن أحب أن أسمع من الآخرين كما أن الخبرات الخاصة بك.

بالإضافة إلى ذلك:ديفيد بيزلي (الرجل يعطي الحديث في ربط فيديو) أشار إلى أن بعض C/C++ امتداد يدويا إطلاق جيل قفل وإذا كانت هذه الإضافات هي الأمثل للمعالجات متعددة النواة (أيالعلمية أو البيانات الرقمية تحليل/الخ.) ثم بدلا من الحصول على فوائد متعددة النواة على عدد الطحن التمديد سيكون شل في أنه يقتصر على جوهر واحد (مما قد تباطؤ البرنامج الخاص بك إلى أسفل إلى حد كبير).من ناحية أخرى إذا كنت لا تستخدم امتداد مثل هذا

السبب أنا لا تستخدم وحدة المعالجة المتعددة هو أن (في هذه الحالة) جزء من البرنامج بشكل كبير شبكة I/O bound (طلبات HTTP) وذلك بعد مجموعة من المواضيع عامل هو وسيلة رائعة للضغط على أداء الصندوق منذ موضوع الحرائق قبالة طلب HTTP ثم لأنه ينتظر على I/O يعطي جيل و آخر خيط يمكن أن تفعل هذا الشيء ، لذلك هذا الجزء من البرنامج يمكن بسهولة تشغيل 100+ المواضيع دون إيذاء الكثير من وحدة المعالجة المركزية و اسمحوا لي فعلا استخدام عرض النطاق الترددي لشبكة الاتصال المتوفرة.أما بالنسبة stackless بيثون/الخ أنا لست مهتمة بشكل مفرط في إعادة كتابة البرنامج أو استبدال بلدي الثعبان المكدس (توافر سيكون أيضا مصدر قلق).

[*] فقط الخيط الرئيسي يمكن أن تتلقى إشارات لذلك إذا كنت ترسل ctrl-C مترجم بايثون في الأساس يحاول الحصول على الخيط الرئيسي لتشغيل لذلك يمكن التعامل مع إشارة ، ولكن لأنه لا التحكم مباشرة والتي الموضوع هو تشغيل (هذا هو اليسار إلى نظام التشغيل) أساسا يحكي نظام التشغيل للحفاظ على التحول المواضيع حتى أنه في نهاية المطاف يضرب الخيط الرئيسي (أي لو كنت سيئ الحظ قد يستغرق بعض الوقت).

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

المحلول

لم أسمع أبدا عن أي شخص باستخدام Stations set للحصول على مكسب أداء مع Python. لا يعني أنه لا يمكن أن يحدث في قضيتك، ولكن بالتأكيد نشر نتائجك حتى يتمكن الآخرون من نقد أساليبك القياسية وتوفير التحقق من الصحة.

شخصيا على الرغم من ذلك، أود أن أقفل مؤشرات الترابط I / O الخاص بك من المواضيع المنفصلة وحدة المعالجة المركزية باستخدام قائمة انتظار الرسائل. وبهذه الطريقة أصبحت نهايتك الأمامية الآن شبكة كاملة I / O مرتبطة (بعضها باستخدام واجهة HTTP، بعضها مع واجهة قائمة انتظار الرسائل) ومثالي لموقف الخيوط الخاص بك. ثم يمكن أن تستخدم العمليات الشديدة وحدة المعالجة المركزية إما تعددية أو أن تكون عمليات فردية فقط في انتظار العمل للوصول إلى قائمة انتظار الرسائل.

على المدى الطويل، قد ترغب أيضا في التفكير في استبدال I / O ملتوية مع ملتوية أو شيء مثل Eventlets. لأنه، حتى لو لم يساعدوا في الأداء، فيجب عليهم تحسين قابلية التوسع. أصبحت النهاية الخلفية الخاصة بك الآن قابلة للتحجيم بالفعل لأنه يمكنك تشغيل قائمة انتظار الرسائل عبر أي عدد من الآلات + CPU حسب الحاجة.

نصائح أخرى

حل آخر هو:http://docs.python.org/library/multiprocessing.html.

ملاحظة 1: هذا هو ليس قيود لغة بيثون، ولكن من تنفيذ CPYTHON.

الملاحظة 2: فيما يتعلق بالتقارب، يجب ألا يمتلك نظام التشغيل الخاص بك مشكلة في القيام بذلك بنفسها.

حل مثير للاهتمام هو التجربة التي أبلغت بها ريان كيلي على مدونته: http://www.rfk.id.au/blog/entry/a-gil-adventure-threading2/

النتائج تبدو مرضية للغاية.

لقد وجدت قاعدة ما يكفي من الإبهام التالية على مر السنين: إذا كان العمال يعتمدون على بعض الحالة المشتركة، فأنا أستخدم عملية واحدة متعددة المعالجات لكل كور (وحدة المعالجة المركزية)، والاستراحة، وحجم إصلاح من خيوط العامل (I / O ). سيعتني نظام التشغيل بمساعدة عمليات Python المختلفة إلى النوى.

الثعبان جيل في مترجم بايثون.هذا يعني فقط لتجنب المشاكل مع أنه في حين تقوم المعالجة المتعددة هو ببساطة بدء متعددة المترجمين (أيباستخدام عمليات منفصلة بدلا من المواضيع عن التزامن) ثم استخدام بعض التصنيف البدائية من أجل التواصل بين العمليات (مثل مآخذ).أن يقال, جيل ليس مشكلة عند استخدام الخيوط مع حجب المكالمات I/O.

المشكلة الرئيسية من جيل كما ذكر في وقت سابق أنه لا يمكن تنفيذ مختلفة 2 كود بايثون المواضيع في نفس الوقت.موضوع حظر على عرقلة I/O الاتصال المحظورة ومن ثم لا executin كود بايثون.وهذا يعني أنه لا يتم حظر جيل.إذا كان لديك اثنين من وحدة المعالجة المركزية مكثفة المهام منفصلة الثعبان المواضيع, حيث ان جيل يقتل معالجة متعددة في بيثون (فقط CPython التنفيذ ، كما أشار في وقت سابق).لأن جيل توقف CPU #1 من تنفيذ الثعبان الخيط حين CPU #0 مشغول المنفذة الأخرى الثعبان الموضوع.

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

هذا سؤال قديم جدا ولكن منذ كل مرة أقوم بالبحث حول المعلومات المتعلقة بثثون والأداء في الأنظمة متعددة النواة، فإن هذا المنشور دائما في قائمة النتائج، لن أسمح لهذا الماضي بتمشير أفكاري.

يمكنك استخدام الوحدة النمطية متعددة المعالجات التي بدلا من إنشاء مؤشرات الترابط لكل مهمة، فإنه يخلق عملية أخرى من CPYTHON APPORTING تفسير التعليمات البرمجية الخاصة بك. من شأنه أن يجعل طلبك للاستفادة من أنظمة متعدد الصور. المشكلة الوحيدة التي أراها في هذا النهج هي أن لديك مرفقات كبيرة من خلال إنشاء مكدس عملية جديد بالكامل على الذاكرة. فيhttp://en.wikipedia.org/wiki/thread_(Computing)#how_threads_differ_from_processes.)

Python Multiprocessing الوحدة:http://docs.python.org/dev/library/multiprocessing.html

"السبب في أنني لا أستخدم الوحدة النمطية متعددة المعالجات هي أن الجزء (في هذه الحالة) جزء من البرنامج هو شبكة I / o مرتبطة (طلبات HTTP)، لذا فإن وجود مجموعة من خيوط العامل هو وسيلة رائعة لعدم الضغط من صندوق ... "

حول هذا الأمر، أعتقد أنه يمكنك الحصول على مجموعة من العملية أيضا: http://docs.python.org/dev/library/multiprocessing.html#us-a-pool-of-ampers.

ATT، ليو.

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