iOS GCD: Unterschied zwischen einer globalen Warteschlange und der mit Hintergrundpriorität (DISPATCH_QUEUE_PRIORITY_BACKGROUND)?
Lese ich Concurrency Programming Guide und die Dinge verwirren mich.
Ich sehe eine Menge von code aufrufen der folgenden für irgendwelche hintergrund-task:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
Nun, was meine ich mit 'hintergrund' ist die populäre Bedeutung:
Etwas ausgeführt wird, an anderer Stelle als dem Haupt (UI) - thread
Also nach den docs, die obige Anweisung gibt alle nicht-Haupt-thread-Warteschlange mit unterschiedlichen Prioritäten.
Meine Frage ist - warum wird dann DISPATCH_QUEUE_PRIORITY_BACKGROUND
vorhanden???
In letzter Zeit sehe ich auch viele von asynchronen Aufgaben mithilfe von DISPATCH_QUEUE_PRIORITY_BACKGROUND
speziell zum ausführen von hintergrund-tasks.
Nicht Warteschlangen kehrte mit DISPATCH_QUEUE_PRIORITY_DEFAULT
, DISPATCH_QUEUE_PRIORITY_LOW
oder DISPATCH_QUEUE_PRIORITY_HIGH
laufen sehr viel Weg von den Haupt-thread, wenn Sie wieder mit dispatch_get_global_queue
?
Nicht Sie hintergrund-Warteschlangen? Welchen konkreten Zweck hat eine Warteschlange zurückgegeben mit DISPATCH_QUEUE_PRIORITY_BACKGROUND
dienen? Ich habe bereits dies bezeichnet aber nicht viel klären, andere als die beliebte Bedeutung, die ich oben erwähnt.
Ich bin sicher, ich bin ziemlich verwirrt mit Worten - hintergrund und hintergrund-Warteschlangen. Wenn jemand erklären kann, (besser, grafisch) - wird eine große Hilfe sein.
InformationsquelleAutor der Frage Nirav Bhatt | 2014-07-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie viele hintergrund-tasks, die die CPU oder CPUs auf Ihrem Gerät werden gemeinsam zwischen allen von Ihnen. Die meisten der Zeit, ist die richtige Sache zu tun. Wenn eine Aufgabe zu lange dauert, zu beenden, werden Sie das problem lösen, indem Sie versuchen, effizienter zu machen.
In sehr seltenen Fällen haben Sie eine Aufgabe, die dauert eine lange Zeit, aber es ist Ok zu warten. So geben Sie es im HINTERGRUND Priorität. Wenn es irgendeine Arbeit zu tun, bei der Priorität "NORMAL", dass die Arbeit wird getan werden, zuerst, und nur, wenn es eine Ersatz-CPU tut nichts anderes, der HINTERGRUND-task ausgeführt werden soll. Und da ist die Warteschlange mit HOHER Priorität, tasks in die Warteschlange wird zuerst ausgeführt werden; würden Sie tun, wenn für eine bestimmte Aufgabe muss beendet werden, so schnell wie möglich auch wenn es bedeutet, dass andere Aufgaben werden verzögert.
Aus Sicht der Programmierlogik, die alle drei queues sind identisch. Es beeinflusst nur, welche Aufgaben das Betriebssystem versucht, als Erster über die Ziellinie, und die es nicht kümmert, dass viel.
InformationsquelleAutor der Antwort gnasher729
Erklärt ist das ziemlich gut in den Versand/Warteschlange.h header:
Und halten Sie im Verstand dies ist eine globalen Warteschlange. Andere Dinge, wie die system-frameworks, kann die Terminierung in. Es ist sehr einfach verhungern die Priorität bands - wenn es gibt eine Menge von
DISPATCH_QUEUE_PRIORITY_HIGH
Aufgaben geplant werden, Aufgaben auf die Standard-Priorität müssen möglicherweise eine ganze Weile warten, bevor Sie ausgeführt wird. Und Aufgaben in DISPATCH_QUEUE_PRIORITY_BACKGROUND müssen möglicherweise warten, ein sehr lange Zeit, wie alle anderen Prioritäten über Ihnen muss leer sein.Viele Entwickler missbrauchen den globalen gleichzeitigen Warteschlange. Sie möchten ein ausführen blockieren, müssen Sie eine Warteschlange, und benutzen Sie einfach, dass die Standard-Priorität. Diese Art von Praxis kann dazu führen, einige sehr schwierig zu beheben bugs. Die Globale concurrent queue ist eine gemeinsame Ressource und sollte mit Sorgfalt behandelt werden. In den meisten Fällen macht es mehr Sinn, zum erstellen einer privaten Warteschlange.
Einer gleichzeitigen Warteschlange ist nicht asynchron, es ist gleichzeitigen. Synchrone Aufgaben können weiterhin geplant werden, und Sie werden immer noch synchron ausführen. Concurrent queues, wie serielle queues dequeue-in FIFO-Reihenfolge. Führen Sie Blöcke gleichzeitig, im Gegensatz zu seriellen queues. Gleichzeitige und asynchrone sind nicht das gleiche.
Beachten Sie auch, dass, wenn der Haupt-thread befindet sich im Leerlauf, eine concurrent queue wieder verwenden können, Faden - und in der Tat wird es vorziehen, zu tun, dass zum erstellen von neuen threads. Mit einer gleichzeitigen Warteschlange nicht Garantie Sie nicht blockieren die Benutzer-Schnittstelle:
GCD macht keine Garantien, was thread wird verwendet, um führen Sie einen block auf einer gleichzeitigen Warteschlange. Wenn Sie die main queue, wird der block ausgeführt werden Seriell auf dem Haupt-thread. Eine concurrent queue verwenden können, jeder thread, und als Optimierung wird lieber vorhandene threads. Es wird nur einen neuen thread erstellen, wenn keine threads verfügbar sind, wiederverwendet zu werden. Und in der Tat der Haupt-thread ist es oft die erste Wahl (wenn der Haupt-thread ist für die Arbeit verfügbar), weil es "warm".
Wiederholen:
Mit Grand Central Dispatch, können Sie sicher sein, dass eine Aufgabe ausgeführt wird, auf dem Haupt-thread (indem Sie sich der Haupt-queue).
Sie können sicher sein, dass eine Aufgabe nicht auf dem primären thread ausgeführt.
InformationsquelleAutor der Antwort quellish