يمكنك معرفة ذلك من خلال النظر إلى الصفحة. وهو 283،645 في الثانية الواحدة في تسلسل JSON.
ومع ذلك ، فإن هذا الرقم له معنى عملي قليل.
أولاً ، يقوم خادم الويب النموذجي بتنفيذ عمليات مثل مصادقة المستخدم ، والوصول إلى قاعدة البيانات ، وإنشاء HTML ، وبالتالي فإن وقت المعالجة أطول بكثير. هذا يعني ببساطة أن وقت المعالجة Sanic لا يكاد يذكر.
أيضًا ، لا توجد حالات كثيرة يحتاج فيها تطبيق الويب إلى أكثر من 1000 عملية في الثانية. أولاً ، يمكن لخادم الويب مثل Niginx معالجة الملفات الثابتة وتخزينها مؤقتًا. إذا قمت بذلك ، فمن غير المرجح أن يحتاج النظام الداخلي لشركتك الذي يضم 10000 موظف إلى 1000 عملية في الثانية.
حتى الآن ، تستخدم Dgango و Flask بشكل رئيسي لأنها كافية بشكل عام في كثير من الحالات. إذا كانت لديك مشكلة ، فمن الأفضل عادة استخدام لغة Go ، والتي هي أسرع ولديها قدرات معالجة متوازية أكثر من استخدام Sanic في Python. لاحظ أن هذا لا يعني أن Sanic لا يستخدم ، ولكن إذا أصبح عدد العمليات في الثانية كبيرًا جدًا ، فغالبًا ما يكون Python نفسه غير مناسب لتلك العملية. .
المشاهدات : 80 مرة · طلب Masahiro Ishizuka
شكرا لردكم
> بشكل عام ، من الأفضل استخدام لغة Go ، والتي تتميز بأسرع ولديها وظائف معالجة متوازية أكثر من استخدام Sanic في Python.
> بشكل عام ، من الأفضل استخدام لغة Go ، والتي تتميز بأسرع ولديها وظائف معالجة متوازية أكثر من استخدام Sanic في Python.
أنا أرى ، معًا
ملخص
- ضمنت GIL أن multithreading لا يستفيد من multicore.
إذا كانت هذه المدونة صحيحة ، ونحن نعتبرها معًا ، فإن Python هي لغة برمجة لا تستفيد من وحدات المعالجة المركزية متعددة النواة. إذا كنت لا تحتاج إلى مكتبات الذكاء الاصطناعي أو الذكاء الاصطناعي ، فإن Go go lang أفضل من Python ، لكن إذا تم تحسين الذكاء الاصطناعي ومكتبات التعلم الآلي لـ Go lang و Python نأمل أن يتم حل الإطار أو الدعم الرسمي لوحدات المعالجة المركزية متعددة النواة في المستقبل. هناك أيضًا منظمة العفو الدولية ، والتعلم الآلي ، ومكتبة التحليل الرقمي التي طورتها Google تسمى TensorFlow for Go lang . يمكن استخدام واجهة برمجة التطبيقات هذه في Go lang ، ولكن لا يزال Python هو الوحيد الذي يمكنه بناء النماذج وتعلمها ، لذلك آمل أن يتم تحسينها في المستقبل.
المؤلف الأصلي
فيما يتعلق بـ GIL ، فعادة ما لا يمثل ذلك مشكلة لأنه يمكن القضاء على المعالجة الثقيلة عن طريق كتابتها في C / C ++ أو باستخدام مكتبة مكتوبة في C / C ++. ومع ذلك ، إذا أصبح عدد العمليات في الثانية كبيرًا جدًا ، فلا يمكن تجنب تصادمات المعالجة ، ويصبح Python غير فعال. لذلك أوصي فقط باستخدام Go. إذا لم تكن كبيرة ، فإن تطوير بيثون وحده لا يمثل مشكلة. بالنسبة إلى المقاييس الكبيرة ، قد يكون من الضروري حساب واختبار ما إذا كان بيثون وحده قادر على تحمله أم لا.
بالنسبة للتعلم الآلي ، يستخدم التدريب الكثير من البيانات لإجراء الكثير من العمليات الحسابية. في هذا الصدد ، تعتبر Python جيدة في Go وغير جيدة في Go ، لذلك لن تكون Go قادرة أبدًا على بناء نماذج التعلم الآلي وتعلمها.
من ناحية أخرى ، في العملية التي تستخدم النتيجة المستخلصة ، يكون الحساب خفيفًا لأنه يتم استخدام النتيجة فقط. إذا كان عليك التعامل مع الكثير من المعالجة هنا ، فهناك واجهة برمجة تطبيقات لـ Go لأن Go مناسبة أكثر للأسباب المذكورة أعلاه.
تم تطوير كل من TesorFlow و Go من قِبل Google ، لكنه نتيجة النظر في خصائص Python و Go ، لذلك من الأفضل الاعتقاد بأنها لن تكون موحدة.
عرض السؤال
مقدمة من المجيبين
إنه التحقق من قراءة مدونة Python3.
ربما،
في Python2 & 3 ، نظرًا لأنه عبارة عن خيط متعدد النواة ومتعدد الخيوط ، تم التحقق من أنه يختلف عن خيط متعدد النوى ومتعدد صحيح مثل JAVA أو Go lang (Go language).
صحيح دعم متعدد النواة ومتعدد الصفحات مع uvloop؟
قد يكون من الممكن القول.
عون الرئيس التنفيذي لشركة ماساهيرو إيشيزوكا
هاتف: 042-559-8638
iPhone: 070-3861-5011
تعرف على سبب استخدام asyncio لمؤشرات POSIX
وكان سهم.
دعا Tokibito-sensei ( id: nullpobug ) إلى المكتب للعب ، لذلك ذهبنا إلى المجمع المفتوح. أجريت محادثة مع السيد aodag ( id: aodag ) ، لكنني تذكرت ما كنت قلقًا من قبل.
كنت قلقا
أثناء إعداد عرض تقديمي لجلسة دراسة ، قمت بإعداد مثال رمز يرسل طلب HTTP إلى خادم يستخدم المزامنة و aiohttp.
استيراد aiohttp استيراد المتزامن إحضار def جلب (l ، url): غير متزامن مع aiohttp.ClientSession (حلقة = l) كجلسة: غير متزامن مع session.get (url) كاستجابة: إرجاع انتظار الرد. النص () عدم التزامن الرئيسي (l ، url ، num): المهام = [إحضار (l ، url) لـ _ في النطاق (الأسطوانات)] إرجاع انتظار asyncio.gather (* المهام) إذا __name__ == '__main__' : حلقة = asyncio.get_event_loop () النتائج = loop.run_until_complete (main (loop ، 'http: // localhost: 8000' ، 3 )) للحصول على r في النتائج: طباعة (ص)
لدى PyCharm وظيفة لعرض "مخطط التزامن" ، ويمكنك التحقق من حركة الخيوط والعمليات ، وسلوك الخيوط عند تنفيذ هذا الرمز هو على النحو التالي.
لسبب ما ،
concurrent.futures.ThreadPoolExecutor
يظهر. حاولت معرفة ما هو مكتوب في المستند ، لكن لأنني لم أتمكن من العثور على أي أوصاف كهذه ، استسلمت وطلبت من Aodag و Tokibito.
socket.getaddrinfo
وجد السبب في عشرات الدقائق.
socket.getaddrinfo
تنفيذ socket.getaddrinfo
بشكل متزامن ، socket.getaddrinfo
أن تطبيق cpython لا ينفذ هذا بشكل غير متزامن ، لكنه ينفذ concurrent.futures.ThreadPoolExecutor
عدة مؤشرات ترابط.- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L666-L673
- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L627-L636
تم تحضير عينة باستخدام aioredis كعينة كود لم يتم فيها استخدام getaddrinfo. الاتصال بملقم Redis محليًا باستخدام مأخذ مجال UNIX .
استيراد المتزامن استيراد aioredis async def connection_example (مفتاح): conn = في انتظار aioredis.create_connection ( '/tmp/redis.sock' ) الإرجاع في انتظار conn.execute ( "GET" ، المفتاح) غير متزامن def الرئيسي (الأسطوانات): المهام = [connection_example ( 'مفتاحي' ) لـ _ في النطاق (الأسطوانات)] إرجاع انتظار asyncio.gather (* المهام) إذا __name__ == '__main__' : حلقة = asyncio.get_event_loop () النتائج = loop.run_until_complete (main ( 3 )) للحصول على r في النتائج: طباعة (ص)
بالمناسبة ، redis config هو ↓.
شيطان لا pidfile /var/run/redis.pid unixsocket /tmp/redis.sock unixsocketperm 700 ملف السجل "" قواعد البيانات 1
بالنظر إلى مخطط التزامن في هذا الوقت ،
بالتأكيد لم يتم إنشاء خيوط.
الوصول إلى خادم Redis خارجي
استيراد المتزامن استيراد aioredis async def connection_example (مفتاح): conn = انتظار aioredis.create_connection ( ( 'seaof-xxx-xxx.arukascloud.io' ، 311390 ) ، ديسيبل = 0 ، كلمة المرور = 'xxxxxxxxxxxxxxx' ) الإرجاع في انتظار conn.execute ( "GET" ، المفتاح) غير متزامن def الرئيسي (الأسطوانات): المهام = [connection_example ( 'مفتاحي' ) لـ _ في النطاق (الأسطوانات)] إرجاع انتظار asyncio.gather (* المهام) إذا __name__ == '__main__' : حلقة = asyncio.get_event_loop () النتائج = loop.run_until_complete (main ( 3 )) للحصول على r في النتائج: طباعة (ص)
عند تنفيذها ، هو على النحو التالي.
يبدو أن يتم إنشاء مؤشر ترابط العامل بعد كل شيء.
كم عدد مؤشرات ترابط العامل التي يتم إنشاؤها لـ ThreadPoolExecutor؟
مخطط التزامن عندما يقتصر عدد عمليات الإعدام المتزامنة في إشارة على 3 على النحو التالي.
على ما يبدو ، لا يتم إعادة استخدام مؤشر الترابط في ThreadPoolExecutor. تم وصف المدى الذي تم إنشاؤه به في الوثائق الموجودة ضمن ThreadPoolExecutor.
إذا كان max_workers بلا أو غير محدد ، فإن القيمة الافتراضية هي عدد المعالجات على الجهاز مضروبة في 5.17.4 - Concurrent.futures - تنفيذ المهمة المتزامنة - وثائق Python 3.6.1
أبعث حوالي 30 طلبًا للتجربة (سيمافور 3).
تم إنشاء ما يصل إلى 20 ، وتم التأكيد على إعادة استخدامها بعد ذلك. على الرغم من أنه لا يمكن تغيير الحد الأعلى لمؤشر ترابط العامل بسبب التنفيذ ، فمن غير المحتمل أن تكون هناك أي مشكلات.
uvloop
بالنسبة ل UVloop ، تم التأكيد على أنهم عملوا بجد دون استخدام خيوط POSIX .
استيراد uvloop # تم الحذف حلقة = uvloop.new_event_loop () asyncio.set_event_loop (حلقة)
عند تنفيذها ،
حقا
وفي الختام
Aodag-sensei و tokibito-sensei رائعان ... كنت أقرأ وأترك الوثيقة رطبة ، لكنني استغرقت عشر دقائق لإيجاد السبب وأخبرني. أنا أيضًا عضو في المجتمع من الغد ، لذلك سأعمل بجد من أجل شخصين.
يبدو أن هناك جامعًا مفتوحًا مع Mr. aodag و Mr. tokibito يعملان في التوظيف. شكرا لك
0 コメント:
コメントを投稿