أكثر

يستغرق تنفيذ كود Python الكثير من الوقت (أكثر من ساعتين)؟ (Arcgis10.1)

يستغرق تنفيذ كود Python الكثير من الوقت (أكثر من ساعتين)؟ (Arcgis10.1)


أقوم بتنفيذ كود Python هذا ، والذي أحاول فيه تحديد موقع الطرد المجاور (الشمال ، الجنوب ، الشرق ، الغرب).

إنه يعمل بشكل جيد ولكنه استغرق ساعتين مقابل 50 طردًا فقط!

أعتقد أن هناك خطأ ما. هل هذا وقت التنفيذ طبيعي؟ هل لديك أي اقتراحات لجعلها أسرع؟

أنا أستخدم Arcgis10.1 ، Arcpy ، Python2.7 استيراد Arcpy استيراد الرياضيات استيراد ArcView

arcpy.env.workspace = "D: /Users/saadiya/Documents/ArcGIS/Default1.gdb" arcpy.env.overwriteOutput = مساحة العمل الحقيقية = "C: / Saadia / SAFTOP / Parcelle et rivrains / simulation arcgis" لـ i في النطاق (1،50): التعبير = '"src_OBJECTID" =' + str (i) output_table = "table" + str (i) arcpy.PolygonNeighbours_analysis ("P_dataset"، "Voisins") arcpy.TableSelect_analysis ("Voisins"، output_table ، تعبير) arcpy.MakeFeatureLayer_management ("P_dataset"، "Parcelles_class1_copy") arcpy.AddJoin_management ("Parcelles_class1_copy"، "OBJECTID"، output_table، "nbr_OBJECTID"، "KEEP_ALL =" target_ALL_ALL = target_OBJECTID " "P_dataset.OBJECTID" = '+ str (i) #print whereeclause1 arcpy.Select_analysis ("Parcelles_class1_copy"، target_parcel، whereeclause1) Neighbours = "Neighbours_2" + str (i) whereeclause2 = output_table_2 +' ._OBJECTID = #print whereeclause2 arcpy.Select_analysis ("Parcelles_class1_copy"، Neighbours، whereeclause2) arcpy.RemoveJoin_management ("Parcelles_class1_copy"، output_table) target_ne ighbor_parcels = "target_neighbor_parcels_2" + str (i) arcpy.Union_analysis ([target_parcel، Neighbours]، target_neighbor_parcels، "ALL") centroide = "centroide_2" + str (i) arcpy.FeatureToPoint_management (target_neighbor_parYp)، cur = arcpy.UpdateCursor (centroide) arcpy.AddField_management (centroide، "Gisement"، "DOUBLE") arcpy.AddField_management (centroide، "Orientation"، "TEXT") arcpy.Delete_management (output_table) arcelete. Delete_management (Neighbours) arcpy.Delete_management (target_neighbor_parcels) cur = arcpy.UpdateCursor (centroide) للصف في cur: a = output_table_2 + "_ src_FID_1" # print a condition = row.getValue (a) if (condition == 0): PointX = row.getValue ("POINT_X") PointY = row.getValue ("POINT_Y") end_x = PointX end_y = PointY elif (condition! = 0): PointX = row.getValue ("POINT_X") PointY = row.getValue ("POINT_Y ") #print end_x #print end_y #print PointX #print PointY dx = (end_x - PointX) dy = (end_y - PointY) #print dx #print dy azimuth = math.atan2 (dx، dy) # طباعة السمت السمت_gr = السمت * 200 / 3.14519 print azimuth_gr if (dy> = 0 and dx> = 0): print 1 azimuth_correct = azimuth_gr elif (dy> = 0 and dx <= 0): print 2 azimuth_correct = 200- azimuth_gr elif (dy <= 0 and dx <= 0): print 3 azimuth_correct = 200 + azimuth_gr elif (dy <= 0 and dx> = 0 ): طباعة 4 azimuth_correct = 400 - azimuth_gr print azimuth_correct row.setValue ("Gisement"، azimuth_correct) cur.updateRow (row) Position = row.getValue ("Gisement") #print Position if (Position> 45 and Position <= 135 ): Orient = "Est" elif (الموضع> 135 والموضع <= 225): Orient = "Sud" elif (Position> 225 and Position <= 315): Orient = "Ouest" elif (الموضع> 315 والموضع <= 400): Orient = "Nord" elif (Position> 0 and Position <= 45): Orient = "Nord" elif (Position == 0): Orient = "" print Orient row.setValue ("Orientation"، Orient) cur .updateRow (صف)

كانت لدي نفس التجربة ، لكنني أدركت أنه عندما قمت بتحويل البرنامج النصي إلى أداة نصية ArcGIS ، انخفض وقت التنفيذ إلى 12 دقيقة. أداة البرنامج النصي مثل صندوق الأدوات. تقوم بتوصيل البرنامج النصي الخاص بك بالأداة. ستحتاج إلى إضافة بضعة أسطر في البرنامج النصي الخاص بك لتعيين المعلمات. يتم ذلك من خلال وظيفة GetParameterAsText ArcPy. يوفر هذا http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//001500000006000000.htm جولة سريعة حول كيفية إنشاء أدوات البرنامج النصي.


أود أن أؤكد كما يقترحVince إذا كانت مجموعات البيانات المدخلة لها مؤشرات مكانية. إذا كانت مدخلاتك عبارة عن ملفات أشكال ، فهذه افتراضيًا لا تحتوي على مؤشرات مكانية وتحتاج إلى بناء.

هناك اقتراح آخر من شأنه تسريع شفرتك وهو استبدال المؤشر الذي تستخدمه بمؤشر من ملفداالوحدة النمطية كما هو موضح هنا.


لا أفهم تمامًا ناتج تحليلك ، ولكن يبدو أنه بالنسبة لكل ميزة يتم تقييمها ، فإنك تقوم بالكثير من العبث - نسخ مجموعات البيانات ، والانضمام إليها ، وإضافة الحقول ، وحذفها. إذا كنت لا تحتاج إلى القيام بها في كل مرة ، فافعلها مرة واحدة خارج الحلقة الخاصة بك.

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

وقت الاستيراد start_time = time.time ()

ثم أينما تريد أن ترى الوقت المنقضي ، أضف:

وقت الطباعة. time () - start_time

إيقاف / إنهاء عملية من سطر الأوامر بعد فترة زمنية معينة

لدي كود Python الذي يستمع ويكتشف الأصوات البيئية. إنه ليس مشروعي ، لقد وجدته على الويب (SoPaRe). باستخدام الأمر ./sopare.py -l ، يبدأ في تسجيل الأصوات ولكن في حلقة لا نهائية. عندما أريد إيقافه ، لا بد لي من الضغط على Ctrl + C.

هدفي هو إيقاف هذا البرنامج تلقائيًا بعد 10 ثوانٍ ، لكن عندما تحدثت مع المؤلف قال إن البرنامج ليس به محدد زمني.

حاولت قتله عن طريق قتل PID ، لكن PID يتغير في كل مرة عند تشغيل البرنامج. كيف يمكن ايقافه بعد فاصل زمني عن طريق باش؟

بدلاً من ذلك ، يمكنني تنفيذ هذا الأمر من python باستخدام الأمر os.system ().


بطانة واحدة للعثور على العمليات التي تم تشغيلها لأكثر من ساعتين

ملاحظة: أمر عملية لقطة

-o: تضمين أعمدة محددة فقط

etimes: الوقت المنقضي منذ بدء العملية ، بالثواني

الأمر: الأمر بكل متغيراته كسلسلة

awk: مسح النمط ولغة المعالجة

2 دولار: الرمز الثاني من كل سطر (الفاصل الافتراضي هو المسافة)

7200: 7200 ثانية = ساعتان

شيء كتبته قبل عامين. يبحث هذا عن اسم التطبيق المُدرج في متغير اسم المشروع وسيقتله إذا كان أقدم من القيمة في متغير وقت القتل (بالثواني). سيتعين عليك تغيير الاسم المستعار لمطابقة اسم العملية الذي تم إرجاعه باستخدام ps -o comm. وسيتعين عليك أيضًا تغيير القيمة في وقت القتل لمطابقة عدد الثواني التي تريدها. يمكن إطلاق النار من cronjob للتفتيش بين الحين والآخر.

تأكد من أنك تعرف ما يفعله كل هذا قبل تشغيله وإلا فقد يقتل عمليات غير متوقعة.

يعمل هذا في RHEL 7.x لذا فهو ليس إيجابيًا بشأن Solaris ولكنه قريب جدًا لذا قد يعمل مع تعديلات قليلة أو بدون تعديلات. إذا كانت هناك أخطاء في التنسيق أعتذر. كان لدي بعض فوضى التنسيق المتبقية اضطررت للتنظيف.


تحميل Python في نافذة Python

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

ينشئ قائمة فريدة من قيم الحقول بناءً على فئة المعلم واسم الحقل


12 إجابات 12

تتطلب أجهزة SVM المنبثقة حساب دالة المسافة بين كل نقطة في مجموعة البيانات ، وهي التكلفة المسيطرة على $ mathcal(n_ نص مرات n_ نص^ 2) دولار. يعد تخزين المسافات عبئًا على الذاكرة ، لذا يُعاد حسابها سريعًا. لحسن الحظ ، هناك حاجة فقط للنقاط الأقرب لحدود القرار في معظم الأوقات. يتم تخزين المسافات المحسوبة بشكل متكرر في ذاكرة تخزين مؤقت. إذا تم تحطيم ذاكرة التخزين المؤقت ، فإن وقت التشغيل ينفجر إلى $ mathcal(n_ نص مرات n_ نص^3)$.

يمكنك زيادة ذاكرة التخزين المؤقت هذه عن طريق استدعاء SVR كـ

بشكل عام ، هذا لن ينجح. ولكن لم نفقد كل شيء. يمكنك أخذ عينة فرعية من البيانات واستخدام الباقي كمجموعة تحقق ، أو يمكنك اختيار نموذج مختلف. فوق نطاق الملاحظة 200000 ، من الحكمة اختيار المتعلمين الخطيين.

يمكن تقريب Kernel SVM ، عن طريق تقريب مصفوفة النواة وإطعامها إلى SVM خطي. يتيح لك هذا المفاضلة بين الدقة والأداء في الوقت الخطي.

من الوسائل الشائعة لتحقيق ذلك استخدام 100 أو نحو ذلك من المراكز العنقودية التي تم العثور عليها بواسطة kmeans / kmeans ++ كأساس لوظيفة النواة الخاصة بك. يتم بعد ذلك إدخال الميزات المشتقة الجديدة في نموذج خطي. هذا يعمل بشكل جيد جدا في الممارسة. أدوات مثل sophia-ml و vowpal wabbit هي كيفية قيام Google و Yahoo و Microsoft بهذا. يصبح الإدخال / الإخراج التكلفة المهيمنة للمتعلمين الخطيين البسيطين.

في وفرة البيانات ، تؤدي النماذج اللامعلمية نفس الأداء تقريبًا في معظم المشكلات. الاستثناءات عبارة عن مدخلات منظمة ، مثل النصوص والصور والسلاسل الزمنية والصوت.


الحل المقترح

إذا كنت تأخذ في الاعتبار أن كل رقم سداسي هو أيضًا رقم مثلث ، فيمكنك تجاهل الأرقام المثلثية تمامًا:

يستغرق الحل الأخير حوالي 50 مللي ثانية للتشغيل على جهازي.

24 دورة ، واستغرق 6 دورات لإكمالها و 64 بت int أبطأ بشكل كبير ، في حين أن FDIV هو 14-16 دورة ، و 4-5 دورات لإكمال) ، وفي CPython ، يكون العمل المرتبط بـ int أكثر تكلفة ، لأنه يحتاج إلى حساب الدقة اللانهائية int s ، حيث يقوم float بالقسمة المزدوجة لـ C الخام. $ endgroup $ & ndash ShadowRanger 5 سبتمبر 2019 الساعة 16:05

13 مللي ثانية ، مع # 1 + # 2 + # 3 يسقطها إلى 8.5 مللي ثانية) ، ما يقرب من 2 / 3s تقليل في وقت التشغيل ، بالنسبة للكود الذي (بالنسبة لي على الأقل) يمكن قراءته بشكل متساوٍ ولا يستخدم رمزًا صعبًا حقًا يستخدم فقط للضغط بضع نانو ثانية. $ endgroup $ & ndash ShadowRanger 5 سبتمبر 2019 الساعة 18:53

المتغيرات العامة لا تساعد في القراءة.

ما الفرق بين triangle و triangle_number؟ هذه الأسماء لا تساعدني في فهم ما تمثله.

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

إذا كنت تريد حقًا التدرب على هيكلة التعليمات البرمجية باستخدام الفئات ، فمن المحتمل أن يكون الفصل عبارة عن Solver.

إذا كنت تختبر x في y ، فمن الأفضل أن تكون y مجموعة ، وليس قائمة ، أو عليك إجراء بحث خطي.


1 إجابة 1

حقًا ، للإجابة على سؤالك ، تحتاج إلى تكوين ملف تعريف الكود الخاص بك. عليك أن تفهم ما الذي يستغرقه كل هذا الوقت. بمجرد النظر إلى الكود الخاص بك ، من المستحيل معرفة ذلك ، ولكن أعتقد أنه يتم قضاء معظم الوقت في أحد الأماكن التالية:

تشغيل كل ملف * .csv تقوم بتشغيله من خلال محلل XML. أشعر أنك تعتبر هذا ضروريًا لتجاهل ملفات XML التي تتظاهر بأنها ملفات CSV. من الناحية المثالية ، يجب عليك القيام بذلك مرة واحدة ، ثم تسمية ملفاتك بشكل صحيح من الآن فصاعدًا حتى لا تضطر إلى إجراء هذا الفحص في كل مرة. يبدو لي هذا أمرًا مكلفًا للغاية للقيام به على هذا النحو ، لقد قمت بتعديل هذا التحقق أدناه بحيث لا يحدث إلا عندما تكون مهتمًا بالفعل بالملف لاحقًا (أي أن مساره يحتوي على "نتائج")

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

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


أفترض أنك تتحدث عن مصابيح LED "داخلية" أو "مدمجة" ، وليس مؤشر LED "إضافي" يتم التحكم فيه من طرف GPIO. إذا كان الأمر كذلك ، فقد تحاول دمج ما يلي في التعليمات البرمجية الخاصة بك:

بالنسبة لمصباح PWR (الطاقة) ، يمكنك إيقاف تشغيله على النحو التالي:

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

من الممكن أن تفعل ما تريد دون إشراك عمليات متعددة أو منفصلة متعددة. هناك مزايا لكل هذه الأساليب الأخرى بالطبع.

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

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

تكمن فائدة هذا المخطط في أنه إذا توقف برنامجك الرئيسي ، فهل الوميض.


3 إجابات 3

قد يكون WebIOPi هو الحل الأفضل بالنسبة لك. https://code.google.com/p/webiopi/ يمكنك تعديل البرنامج وفقًا لاحتياجاتك ، لكن ذلك سيتحكم في جميع دبابيس GPIO من خلال واجهة الويب. جربه ومعرفة ما إذا كان يعمل من أجلك.

تحقق من هذا المشروع المصمم لهذا السبب بالضبط: https://github.com/newbrute/pi-ui

لم يتم تكوين واجهة المستخدم مسبقًا وتوفر مرونة أكثر من الخيارات الأخرى المتاحة

تحرير: لكي نكون واضحين ، هذا حل بديل وليس إصلاحًا لـ WiringPi.

ستتيح لك وظيفة child_process.exec في NodeJS تشغيل برنامج نصي من Python بالتزامن مع هذا الخيار

اكتب برنامج نصي php لموقعك على الويب. هذه هي الصفحة التي ستراها عند الوصول إلى pi.

أرسل قيم الزر عبر طريقة POST إلى البرنامج النصي.

قم باستخراج الرسالة واستدعاء نص Python الذي سيقوم بإجراء التغيير الفعلي على GPIO.

يستدعي السطر الأول نص python النصي الموجود في / home / pi / path / to / وينفذه. سيخبرها> / dev / null أن تضع كل المخرجات في ملف غير موجود وسيقوم أمبير بتشغيلها في الخلفية. آخر 2 ليسا ضروريين حقًا ولكن بدونه سيتم تحميل موقع الويب الخاص بك للمدة التي يستغرقها تنفيذ برنامج Python النصي.

في الوقت الحالي ، تعذر على php بدء تشغيل بايثون بسبب الأمر sudo. إنه ضروري لأننا نحتاج إلى الامتيازات للعمل مع دبابيس GPIO. لذلك علينا القيام بما يلي: sudo nano / etc / sudoers وفي النهاية إضافة www-data ALL = (ALL) NOPASSWD: ALL

اكتب Python Script يأخذ متغيرات الإدخال من php وينفذ المهمة.


9 إجابات 9

انتشار وحدات المعالجة المركزية متعددة النواة مدفوع في الغالب بالعرض وليس الطلب.

أنت محق في أن العديد من المبرمجين لا يهتمون بتحليل أنظمتهم حتى يتمكنوا من الاستفادة من سلاسل تنفيذ متعددة. لذلك يرى العميل فائدة بشكل أساسي من البرمجة المتعددة لنظام التشغيل بدلاً من تنفيذ البرامج متعددة الخيوط.

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

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

لماذا تعدد مؤشرات الترابط ليس في كل مكان؟

أنا أفهم أن خيوط المعالجة المتعددة يصعب تنفيذها ولها عيوب إذا كان عدد سلاسل العمليات أقل من المتوقع.

لماذا تعدد مؤشرات الترابط ليس في كل مكان؟

تحدي الإطار: ولكنه يكون في كل مكان.

دعنا نرى ، دعنا نسمي بعض الأنظمة الأساسية:

  • أجهزة الكمبيوتر المكتبية / أجهزة الكمبيوتر المحمولة: يعد المتصفح أحد أكثر التطبيقات شيوعًا اليوم. وللحصول على أداء جيد ، تستفيد المتصفحات الحديثة من كل ميزة يمكن أن تحصل عليها ، بما في ذلك تعدد مؤشرات الترابط ووحدات معالجة الرسومات وما إلى ذلك. على الأقل ، ستحصل كل علامة تبويب على سلسلة منفصلة. والعديد من التطبيقات الحديثة مبنية أيضًا في HTML مع متصفح مضمن (على سبيل المثال Slack و Discord). الألعاب ، على الأقل الأكبر منها ، احتضنت أيضًا تعدد الخيوط منذ وقت طويل.
  • الخوادم: في هذا اليوم وهذا العصر ، تتعامل معظم الخوادم مع طلبات HTTP ، تعد التقنيات الأخرى مناسبة جدًا. وتتوسع خوادم الويب بشكل جيد لتلائم جميع النوى التي لديك. بالتأكيد ، من المرجح أن يتم تشغيل كل طلب على سلسلة محادثات واحدة ، لكن سلاسل الرسائل المتعددة تعني أنه يمكنك معالجة طلبات متعددة بشكل متوازٍ. إنه قياسي تمامًا. الجزء المشترك الآخر - برنامج قاعدة البيانات - يتوسع أيضًا بشكل جيد ويستخدم أي محرك جاد مؤشرات ترابط متعددة.
  • الهواتف المحمولة / الأجهزة اللوحية: المتصفحات ، مرة أخرى. ولكن حتى بدونهم ، لا يزال هناك الكثير من مهام الخلفية التي تستيقظ بشكل متكرر وتفعل شيئًا بسيطًا. يعني وجود نوى متعددة أن مهام الخلفية هذه تؤثر على تطبيقك الأمامي بدرجة أقل ويبدو أنها تبدو أكثر & quotsnappy & quot. تعد وحدات المعالجة المركزية للهواتف المحمولة قوية جدًا بالفعل ، ولكن متطلبات استخدام الطاقة المنخفضة تعني أنها لا تزال أبطأ مقارنة بأجهزة الكمبيوتر المكتبية - ومع ذلك ، ربما نستخدمها على نطاق أوسع. بما في ذلك العمليات الحسابية الثقيلة مثل الألعاب.

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

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

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

من الصعب الحصول على التعليمات البرمجية متعددة مؤشرات الترابط بشكل صحيح ويصعب تصحيحها كثيرًا. قد تكون هناك ظروف سباق لا تظهر إلا 1/100 مرة يتم فيها تنفيذ البرنامج. من الأسهل بكثير للمبرمج التفكير بشكل صحيح حول برنامج (يبدو أنه) يتم تنفيذه بالترتيب من تنفيذ سلاسل رسائل متعددة بأي عدد من أوامر الوصول إلى الذاكرة المختلفة. وراء الكواليس ، قد يقوم معالج أو مترجم واحد بإعادة ترتيب التعليمات بطريقة تكون مخفية عادة للمبرمج ، ولكنها تتعطل إذا تم تقديم تعدد مؤشرات الترابط.

لدى SEI CERT قائمة بالقواعد التي يجب اتباعها عند تنفيذ التزامن. كل هذه الأمور يجب أن تؤخذ في الاعتبار من قبل المبرمج الكود الصحيح، ومن ثم يجب على المبرمج أيضًا مراعاة الأداء. إذا لم يتم اتباعها ، فقد تحدث ثغرات أمنية خطيرة.


كيف يتم تنفيذ برنامج نصي بيثون على التوت متصل بالإنترنت عبر برنامج نصي يتم تنفيذه على نظام آخر متصل بالإنترنت؟

لقد قرأت نهج خادم الويب وجربته. هذا يظهر لي رمز python مرة أخرى على المتصفح ، إذا قمت بتشغيل "http: // (عنوان IP الخاص بي) /programme.py". حيث يكون programme.py في مجلد "www" لخادم الويب.

أريد أن يتم تنفيذ برنامج يتعامل مع التحكم في دبابيس gpio وفقًا لمنطقي على Pi عن بُعد عبر الإنترنت وهذا أيضًا من برنامج نصي آخر من نوع Python يتم تنفيذه على جهاز آخر متصل بالإنترنت شيء مثل exec ( "عنوان URL للبرنامج على Pi") ويتم تنفيذ هذا البرنامج على Pi حيث يتم توصيل Pi بالإنترنت.

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

لا تسقط التصويت لقد بحثت كثيرًا للقيام بذلك وحاولت كثيرًا. أنا جديد تمامًا على Pi.


شاهد الفيديو: مكتبة تايم التوقيت و التاريخ في لغة بايثون - Time module in Python