كيف أقول multi-core / multi-وحدة المعالجة المركزية آلة لمعالجة المكالمات وظيفة في حلقة بالتوازي ؟

StackOverflow https://stackoverflow.com/questions/56769

  •  09-06-2019
  •  | 
  •  

سؤال

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

العديد من أكثر كثافة العمليات تتصرف deterministically و أن تصلح المعالجة المتوازية.

المقدمة لقد حلقة التي تتكرر على عدد كبير من قطع البيانات القادمين من db و لكل واحد اتصل القطعية الدالة دون آثار جانبية, كيف تجعل من ذلك أن البرنامج لا تنتظر وظيفة في العودة بل مجموعات القادم المكالمات ، حتى يتمكنوا من معالجتها بالتوازي ؟ ساذجة نهج تثبت مبدأ أن تفعل بي الآن.

لقد قرأت جوجل MapReduce الورق و بينما أنا يمكن استخدام المبدأ العام في عدد من الأماكن, لن, الآن الهدف مجموعات كبيرة, بل انها سوف تكون واحدة متعددة النواة أو متعددة وحدة المعالجة المركزية آلة الإصدار 1.0.لذلك حاليا, أنا لست متأكدا مما إذا كان يمكن فعلا استخدام المكتبة أو أن لفة تخلت أسفل النسخة الأساسية نفسي.

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

يرجى ملاحظة أن أنا على بينة من حقيقة أنه قد يستغرق وقتا أطول لاسترداد المقبل قسما من قاعدة البيانات من العملية الحالية العملية برمتها عندئذ I/O زمنيا.غير أنني أفترض الآن أنه ليس في الممارسة استخدام db العنقودية أو ذاكرة التخزين المؤقت أو أي شيء آخر أن ليس I/O-لا بد في هذه المرحلة.

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

المحلول

قد يكون في عداد المفقودين شيء هنا, ولكن هذا يبدو إلى حد ما على التوالي إلى الأمام باستخدام pthreads.

مجموعة صغيرة threadpool مع N المواضيع و يكون موضوع واحد للسيطرة على كل منهم.

سيد الموضوع ببساطة يجلس في حلقة تفعل شيئا مثل:

  1. الحصول على البيانات قطعة من DB
  2. تجد المقبل مجانا الخيط إذا كان لا يوجد موضوع free ثم انتظر
  3. تسليم قطعة إلى ترابط
  4. العودة القادمة قطعة من DB

في هذه الأثناء المواضيع عامل الجلوس والقيام:

  1. مارك نفسي مجانا
  2. انتظر الصاري الموضوع أن تعطيني قطعة من البيانات
  3. عملية على قطعة من البيانات
  4. مارك نفسي حرة مرة أخرى

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

قرص ن ترضيك ...

نصائح أخرى

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

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

import processing

def worker(i):
    return i*i
num_workers = 2
pool = processing.Pool(num_workers)
result = pool.imap(worker, range(100000))

هذا هو نسخة موازية من itertools.imap ، التي توزع الدعوات على العمليات.يمكنك أيضا استخدام apply_async أساليب سباحة و مخزن كسول نتيجة الكائنات في القائمة:

results = []
for i in range(10000):
    results.append(pool.apply_async(worker, i))

وللمزيد من رؤية وثائق تجمع فئة.

Gotchas:

  • تجهيز يستخدم شوكة () ، لذلك عليك أن تكون حذرا في Win32
  • الأشياء المنقولة بين العمليات تحتاج إلى pickleable
  • إذا كان العمال سريع نسبيا, يمكنك قرص chunksize ، أيعدد من عناصر العمل ترسل إلى عامل عملية في دفعة واحدة
  • تجهيز.تجمع يستخدم خلفية الموضوع

يمكنك تنفيذ الخوارزمية من جوجل MapReduce دون الحاجة منفصلة فعليا الآلات.مجرد النظر في كل تلك "الأجهزة" إلى أن "المواضيع". المواضيع تلقائيا توزيعها على أجهزة متعددة النوى.

إذا كنت تعمل مع مترجم من شأنها أن تدعم ذلك ، وأود أن أقترح عليك أن نلقي نظرة على http://www.openmp.org عن طريق التأشير التعليمات البرمجية الخاصة بك في مثل هذه الطريقة التي بعض الحلقات تكون بشكل متوازي.

فإنه لا أكثر, و قد تجد أنه من المفيد جدا.

صفحة تقارير gcc4.2 ستدعم openmp ، على سبيل المثال.

نفس الموضوع تجمع يستخدم في جافا.ولكن المواضيع في threadpools هي serialisable وإرسالها إلى أجهزة الكمبيوتر الأخرى و deserialised إلى تشغيل.

لقد وضعت MapReduce مكتبة متعددة الخيوط/multi-core استخدام على خادم واحد.كل شيء هو العناية من قبل المكتبة ، و المستخدم فقط إلى تنفيذ خريطة الحد.فإنه يتم وضع دفعة المكتبة ، ولكن لم يتم قبول رسمي lib.تحقق من http://www.craighenderson.co.uk/mapreduce

كنت قد تكون مهتمة في دراسة قانون libdispatch, الذي هو المصدر المفتوح تنفيذ أبل الكبير ارسال المركزي.

إنتل TBB أو دفعة::mpi قد تكون ذات فائدة لك أيضا.

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