Was ist der Unterschied zwischen globalen Warteschlangen und Benutzerwarteschlangen? [Duplikat]

8

Ich sehe einige Methoden mit gcd, aber einige von ihnen können es so machen:

%Vor%

aber andere mögen es so machen:

%Vor%

Was sind die Unterschiede? Wenn ich viele Bilder aus dem Internet herunterladen möchte, was ist besser?

    
Jackie 16.12.2012, 06:51
quelle

2 Antworten

19

Der beste Weg, Warteschlangen zu konzeptualisieren, besteht darin, zuerst zu erkennen, dass es auf der untersten Ebene nur zwei Arten von Warteschlangen gibt: serielle und gleichzeitige.

Serielle Warteschlangen sind monogam, aber nicht festgeschrieben. Wenn Sie jeder seriellen Warteschlange mehrere Aufgaben zuweisen, werden sie nacheinander ausgeführt, wobei jeweils nur ein Thread verwendet wird. Der nicht festgeschriebene Aspekt besteht darin, dass Serienwarteschlangen zu einem anderen Thread zwischen Tasks wechseln können. Serielle Warteschlangen warten immer auf den Abschluss einer Aufgabe, bevor sie zur nächsten wechseln. Somit werden Aufgaben in FIFO-Reihenfolge abgeschlossen. Sie können so viele serielle Warteschlangen erstellen, wie Sie benötigen.

Die Hauptwarteschlange ist eine spezielle serielle Warteschlange. Im Gegensatz zu anderen seriellen Warteschlangen, die nicht committed sind, da sie viele Threads "datieren", aber nur einmal, ist die Hauptwarteschlange mit dem Hauptthread "verheiratet" und alle Tasks werden daran ausgeführt. Die Hauptwarteschlange verhält sich gut mit dem Runloop des Hauptthreads, so dass kleine Operationen die UI und andere wichtige Bits nicht blockieren. Wie alle seriellen Warteschlangen werden Tasks in FIFO-Reihenfolge abgeschlossen.

Wenn serielle Warteschlangen monogam sind, sind gleichzeitige Warteschlangen promiskuitiv. Sie werden Aufgaben an jeden verfügbaren Thread senden oder sogar neue Threads erstellen, abhängig von der Systemlast. Sie können mehrere Aufgaben gleichzeitig auf verschiedenen Threads ausführen. Es ist wichtig, dass Aufgaben, die an die globale Warteschlange gesendet werden, Thread-sicher sind und Nebenwirkungen minimieren. Aufgaben werden zur Ausführung in FIFO-Reihenfolge gesendet, aber die Reihenfolge der Fertigstellung ist nicht garantiert.

Bei der Zurückführung sind alle globalen Warteschlangen gleichzeitig und alle Benutzerwarteschlangen sind seriell .

Wenn Sie Bilder herunterladen möchten, möchten Sie wahrscheinlich eine serielle (Benutzer-) Warteschlange. Das Herunterladen von Bildern ist mehr eine Sache mit der Bandbreite. Normalerweise möchten Sie nur eine (oder mehrere) gleichzeitig tun.

edit: Blogpost, der auf der obigen Antwort ausdehnt: Ссылка

    
amattn 16.12.2012, 07:17
quelle
3

Wenn Sie dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); verwenden, wird GCD automatisch genügend Threads erstellen, um den Job zu verarbeiten, und wenn möglich mehrere Kerne verwenden.

Wenn Sie andererseits imageQueue_ = dispatch_queue_create("com.company.app.imageQueue", NULL); verwenden, erhalten Sie eine serielle Warteschlange und ein First-In-First-Out-Verhalten.

Wenn Sie sich keine Gedanken über die Thread-Sicherheit oder die Reihenfolge machen, in der Ihre Jobs zurückkehren, verwenden Sie die erste Methode.

    
Hesham Abd-Elmegid 16.12.2012 07:08
quelle

Tags und Links