2012-10-18 8 views
5

Wir verwenden einen PPL Concurrency :: TaskScheduler, um Ereignisse von unserer Medienpipeline an abonnierte Clients (normalerweise eine GUI-App) zu senden.Wie implementiert man eine Back-off mit Microsoft PPL Lightweight Taskplaner?

Bei diesen Ereignissen handelt es sich um C++ - Lambda, die an übergeben werden. Concurrency :: TaskScheduler :: ScheduleTask().

Aber unter Last kann die Pipeline Ereignisse mit einer höheren Rate generieren, als der Client sie verbrauchen kann.

Gibt es eine PPL-Strategie, die ich verwenden kann, um den Event Dispatcher nicht Warteschlange ein Ereignis (in Wirklichkeit eine geplante Aufgabe), wenn die 'Warteschlange' der geplanten Aufgaben größer als N ist? Und wenn nicht, wie würde ich meine eigenen rollen?

Antwort

1

Mit Blick auf die API scheint es, dass es keine Möglichkeit gibt zu wissen, ob der Scheduler stark ausgelastet ist oder nicht, und es gibt keine Möglichkeit, ihm zu sagen, wie er sich unter solchen Umständen verhalten soll. Nach meinem Verständnis ist es zwar möglich, Grenzen dafür festzulegen, wie viele Contrerent-Threads in einem Scheduler mithilfe von Richtlinien ausgeführt werden dürfen, aber das Protokoll, mit dem der Scheduler neue Tasks annehmen oder ablehnen kann, ist mir nicht klar.

Meine Wette ist, dass Sie diesen Mechanismus selbst implementieren müssen, indem Sie zählen, wie viele Aufgaben bereits im Scheduler sind, und eine Warteschlange vor dem Scheduler haben, die Ihnen hilft, den Fluss eingehender Aufgaben zu verringern.

Ich nehme an, dass Sie eine einfache std :: Warteschlange für Ihre lambdas verwenden könnte, und jedes Mal, wenn ein neues Ereignis haben, können Sie überprüfen, wie viele Aufgaben ausgeführt werden, und fügen Sie so viele aus der Warteschlange wie möglich Ihre max zu erreichen laufende Aufgabenanzahl Wenn die Warteschlange danach immer noch voll ist, verweigern Sie die neue Aufgabe.

Um die Abrechnung der laufenden Aufgaben zu verwalten, können Sie Ihre Aufgaben mit einer Funktion zum Verringern des Zählers zum Abschlusszeitpunkt (verwenden Sie einen Mutex, um Rennen zu vermeiden) umbrechen und den Zähler beim Planen einer neuen Aufgabe erhöhen.

Verwandte Themen