[SWIFT] Eine Methode, die Transformationen parallel auf alle Elemente anwendet und ein Array von Rückgabewerten zurückgibt, die ihre Reihenfolge beibehalten

Überblick

Titel

import Foundation

private let parallelQueue = DispatchQueue(label: "Sequence#parallelMapQueue", attributes: .concurrent)
extension Sequence {
  
  // parallelMap
  //Wenden Sie die Transformation parallel auf alle Elemente an und geben Sie ein Array von Rückgabewerten zurück, die ihre Reihenfolge beibehalten
  //
  func parallelMap<T>(_ transform: @escaping (Element) throws -> T) rethrows -> [T] {
  
    let group = DispatchGroup()
    let semaphore = DispatchSemaphore(value: 1)
    
    var result: [(Int, Result<T, Error>)] = []
    
    zip(0..., self)
      .forEach { i, v in
        
        parallelQueue.async(group: group) {
          
          let r = Result { try transform(v) }
          
          semaphore.wait()
          defer { semaphore.signal() }
          
          result.append((i, r))
        }
    }
    
    group.wait()
    
    return try result
            .sorted { $0.0 < $1.0 }
            .map { try $0.1.get() }
  }
}

Ausführungsbeispiel


print(
  (0...10)
    .parallelMap { i -> Int in
       let t = UInt32([0, 2, 3, 5].randomElement()!)
       sleep(t)
       print(i, t)
       return i + 1
  }
)

//Ausgabebeispiel
//
// 0 0
// 4 0
// 10 0
// 1 2
// 2 2
// 3 2
// 5 2
// 7 2
// 6 3
// 9 3
// 8 5
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

Es ist ersichtlich, dass sie separat (parallel) ausgeführt werden und dass die Reihenfolge der Rückgabewerte beibehalten wird.

Recommended Posts

Eine Methode, die Transformationen parallel auf alle Elemente anwendet und ein Array von Rückgabewerten zurückgibt, die ihre Reihenfolge beibehalten
Ein Programm (Java), das die Summe von ungeraden und geraden Zahlen in einem Array ausgibt
So geben Sie ein Array für den Rückgabewert / das Rückgabeargument einer Methode in der CORBA IDL-Datei an
Verwandeln Sie ein Array von Strings in eine Liste von Ganzzahlen in Java
Erstellen einer ArrayList, mit der Sie die Koordinaten einer zweidimensionalen Ebene eingeben und abrufen können
So testen Sie eine private Methode und verspotten sie teilweise in Java
[Swift] So ermitteln Sie die Anzahl der Elemente in einem Array (Super Basic)
So erstellen Sie eine Beurteilungsmethode, um nach einem beliebigen Zeichen im Array zu suchen
Rails6 Ich möchte ein Array von Werten mit einem Kontrollkästchen erstellen
Übergeben Sie ein Argument an die Methode und erhalten Sie das Ergebnis der Operation als Rückgabewert
[Rails] So speichern Sie die Anforderungs-URL eines Benutzers, der nicht angemeldet ist, vorübergehend und kehren nach der Anmeldung zu dieser URL zurück