سؤال

لا يبدو أن الكود التالي يعمل بشكل صحيح بالنسبة لي. يتطلب الأمر بدء تشغيل ppserver على جهاز كمبيوتر آخر على شبكتك ، على سبيل المثال مع الأمر التالي:

ppserver.py -r -a -w 4

بمجرد بدء تشغيل هذا الخادم ، أقوم بتشغيل هذا الرمز على الجهاز:

import pp
import time
job_server = pp.Server(ppservers = ("*",))
job_server.set_ncpus(0)
def addOneBillion(x):
    r = x
    for i in xrange(10**9):
        r+=1
    f = open('/home/tomb/statusfile.txt', 'a')
    f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n')
    return r

jobs = []
jobs.append(job_server.submit(addOneBillion, (1,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (2,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (3,), (), ("time",)))

for job in jobs:
    print job()
print 'done'

الجزء الفردي: مشاهدة/home/tomb/statusfile.txt ، أستطيع أن أرى أنه يتم كتابة ذلك عدة مرات ، كما لو أن الوظيفة يتم تشغيلها عدة مرات. لقد لاحظت هذا الاستمرار لأكثر من ساعة ، ولم أر أبدا job() إرجاع.

Odder: إذا قمت بتغيير عدد التكرارات في تعريف TestFunc إلى 10 ** 8 ، يتم تشغيل الوظيفة مرة واحدة فقط ، وإرجاع النتيجة كما هو متوقع!

يبدو وكأنه نوع من حالة السباق؟ فقط استخدام النوى المحلية يعمل بشكل جيد. هذا مع PP V 1.6.0 و 1.5.7.

تحديث: حوالي 775،000،000: أحصل على نتائج غير متسقة: تكرار وظيفتان مرة واحدة ، على الانتهاء من المرة الأولى.

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

بعد أشهر تحديث: لا توجد مشاعر صعبة متبقية ، بيثون متوازي. أخطط للعودة بمجرد أن يكون لدي وقت لترحيل طلبي. تحرير العنوان لتعكس الحل.

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

المحلول

إجابة من باجيرا من منتدى بيثون الموازي:

كم من الوقت يستغرق حساب كل وظيفة؟ ألق نظرة على المتغير TRANSPORT_SOCKET_TIMEOUT in /usr/local/lib/python2.6/dist-packages/ptransport.py.

ربما تستغرق عملك وقتًا أطول من الوقت في المتغير أعلاه. زيادة قيمة ذلك وحاول.

تبين أن هذه كانت المشكلة بالضبط. في طلبي ، أستخدم PP كجدول عمل للوظائف التي قد تستغرق عدة دقائق ، لذلك أحتاج إلى ضبط هذا. (كان الافتراضي 30s)

نصائح أخرى

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

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