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

أنا جديد في الإضافات. أحاول تكييف إضافة تستغرق حوالي ساعة لتنفيذها. عند النظر إلى /sidekiq، أرى أن المهمة تعمل كل 30 دقيقة. لذا، قبل انتهاء المهمة الأولى، تبدأ نسخة أخرى من نفس المهمة، مما يؤدي إلى إنشاء نتائج مكررة. كيف يمكنني منع ذلك؟

طريقة واحدة بالطبع هي جعل المهمة تعمل خلال الـ 30 دقيقة المسموح بها، لكن هناك قيود أخرى، وأفضل أن أتركها تعمل طالما تريد.

لقد جربت هذا، لكنه لا يبدو أنه يمنع تشغيل نسخة ثانية من المهمة:

DistributedMutex.synchronize("custom_digest", validity: 180.minutes)

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

أعتقد أنني أقوم بنفس ما ورد في https://review.discourse.org/t/feature-allow-post-process-mutex-to-be-held-longer/5017 و https://review.discourse.org/t/fix-post-and-topic-creation-race-condition/5247، مع استثناء استخدام الأقواس المعقوفة بدلاً من do/end، لكنني لا أعتقد أن ذلك يهم.

DistributedMutex.synchronize(“custom_digest”, validity: 180.minutes) {
do_stuff
}

ومع ذلك، فإن do_stuff يتم تشغيله عدة مرات بشكل متزامن، وذلك في غضون 180 دقيقة.

إذا كان القفل (mutex) داخل كتلة execute، فهذا يعني ببساطة أنه سيتوقف هناك في انتظاره، مما يعني أنك ستشاهد مهمتين تعملان: واحدة تعمل فعليًا والأخرى في انتظار القفل.

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