سؤال

لدي مشكلة في احتاجها x خيوط الانتظار حتى وصلت جميعها إلى نقطة المزامنة. الحلالي يستخدم synchronise الطريقة أدناه التي يتم استدعاؤها بواسطة كل وظيفة خيوط عندما يحتاجون إلى مزامنة.

هل هناك طريقة أفضل للقيام بذلك؟

thread_count = 0
semaphore = threading.Semaphore()
event = threading.Event()

def synchronise(count):
    """ All calls to this method will block until the last (count) call is made """
    with semaphore:
        thread_count += 1
        if thread_count == count:
            event.set()

    event.wait()

def threaded_function():
    # Do something

    # Block until 4 threads have reached this point
    synchronise(4)

    # Continue doing something else
هل كانت مفيدة؟

المحلول

هناك العديد من الطرق لمزامنة المواضيع. عديدة.

بالإضافة إلى المزامنة، يمكنك القيام بأشياء مثل ما يلي.

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

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

هناك عدد من تقنيات الاتصالات الشخصية (IPC) - كل منها يمكن استخدامها لمزامنة الخيط.

نصائح أخرى

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

يبدو رمزك معقول جدا - إنه بسيط وآمن.

لم أستطع العثور على أي تطبيقات "قياسية" للحواجز الخاصة ب Python، لذلك أقترح عليك الاستمرار في استخدام التعليمات البرمجية الخاصة بك.

لاحظ أنه تم تنفيذ الحاجز اعتبارا من بيثون 3.2

مثال على استخدام الحواجز:

from threading import Barrier, Thread

def get_votes(site):
    ballots = conduct_election(site)
    all_polls_closed.wait()        # do not count until all polls are closed
    totals = summarize(ballots)
    publish(site, totals)

all_polls_closed = Barrier(len(sites))
for site in sites:
    Thread(target=get_votes, args=(site,)).start()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top