لماذا لا يوجد جيل في الجهاز الظاهري Java؟ لماذا بايثون بحاجة سيئة للغاية؟

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

سؤال

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

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

المحلول

لا يحتاج Python (اللغة) إلى GIL (وهذا هو السبب في أنه يمكن تنفيذه بشكل مثالي على JVM [Jython] و .NET [Ironpython]، وتلك التطبيقات متعددة الأغراض بحرية). تستخدم CpeThon (التنفيذ الشعبي) دائما جيل لسهولة الترميز (ESP. ترميز آليات جمع القمامة) وتكامل المكتبات غير المشفرة من غير مؤمن على الخيط (استخدمت لتكون طن من من حولها؛ -).

ال UnlaMaten ابتلاع مشروع، من بين أهداف طموحة أخرى، يفعل خطة آلة افتراضية خالية من Gil-free for python - إلى اقتباس هذا الموقع، "بالإضافة إلى ذلك، نعتزم إزالة GIL وإصلاح حالة Multithreading في Python. نحن نعتقد أن هذا ممكن من خلال تنفيذ نظام GC أكثر تطورا، شيء ما مثل Recycler IBM (بيكون وآخرون، 2001). "

نصائح أخرى

تتمتع JVM (نقطة ساخنة على الأقل) بمفهوم مماثل ل "Gil"، إنه أكثر أدقا بكثير في حبيبته القفل، ومعظم هذا يأتي من GC في نقطة اتصال أكثر تقدما.

في CpeThon إنه قفل كبير (ربما ليس صحيحا، ولكن جيدا بما يكفي بالنسبة للحجج من أجل)، في JVM هو أكثر انتشارا مع مفاهيم مختلفة اعتمادا على المكان الذي يتم استخدامه.

ألق نظرة على إلقاء نظرة على، على سبيل المثال، وقت التشغيل VM / Runtime / SafePoint.hpp في رمز نقطة اتصال، وهو حاجز فعال. مرة واحدة في Safeoint، توقف VM بأكمله فيما يتعلق بمبلغ Java، مثل توقف Python VM عند GIL.

في World Java World، تعرف أحداث مؤقتة من VM باسم "إيقاف العالم"، في هذه النقاط فقط القانون الأصلي الذي يرتبط بمعايير معينة قيد التشغيل، وقد تم إيقاف بقية VM.

أيضا عدم وجود قفل خشن في Java يجعل JNI أكثر صعوبة بكثير في الكتابة، حيث أن JVM يجعل ضمانات أقل حول بيئتها للحصول على مكالمات FFI، أحد الأشياء التي تجعل cpython سهلا إلى حد ما (على الرغم من أنها ليست سهلة مثل استخدام ctypes).

هناك تعليق أسفل أدناه في هذه المدونة وظيفة http://www.grouplens.org/node/244. أن تلميحات في السبب في أنه كان من السهل الاستغناء عن Gil for Ironpython أو Jython، هو أن Cpython يستخدم عد مرجعي، في حين أن 2 VMS الأخرى لديها جامعي القمامة.

الميكانيكا الدقيقة لماذا هذا لا أحصل عليها، لكنها تبدو وكأنها سبب معقول.

في هذا حلقة الوصل لديهم التفسير التالي:

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

Python تفتقر إلى JIT / AOT والإطار الزمني الذي كتبه في معالجات متعددة مؤشرات الترابط غير موجودة. بدلا من ذلك، يمكنك إعادة ترجمة كل شيء في جوليا لانج والتي تفتقر إلى GIL واكتساب بعض السرعة على رمز Python الخاص بك. أيضا Jython نوع من تمتص انها أبطأ من cpython وجافا. إذا كنت ترغب في التمسك ب Ython، فكر في استخدام الإضافات الموازية، فلن تكسب دفعة سريعة السرعة ولكن يمكنك القيام برمجة متوازية مع البرنامج المساعد الصحيح.

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