2015-02-27 10 views
5

Piszę szybki skrypt do uruchomienia w terminalu, który rozsyła do wątku tła kilka operacji. Bez dodatkowego wysiłku, po zakończeniu wszystkich moich wysyłek, kod dochodzi do końca pliku i kończy pracę, zabijając także moje operacje w tle. Jaki jest najlepszy sposób na utrzymanie przy życiu szybkiego skryptu, dopóki moje operacje w tle nie zostaną zakończone?Oczekiwanie na asynchroniczne wywołania w szybkim skrypcie

Najlepsze, co wymyśliłem, to następujące rzeczy, ale nie sądzę, że jest to najlepszy sposób, a nawet poprawny.

var semaphores = [dispatch_semaphore_t]() 
while x { 
    var semaphore = dispatch_semaphore_create(0) 
    semaphores.append(semaphore) 
    dispatch_background { 
    //do lengthy operation 
    dispatch_semaphore_signal(semaphore) 
    } 
} 

for semaphore in semaphores { 
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
} 
+1

możliwy duplikat [Wielu pracowników w narzędziu wiersza poleceń Swift] (http://stackoverflow.com/questions/28590701/multiple-workers-in-swift-command-line-tool) –

Odpowiedz

0

Jak o coś takiego:

func runThingsInTheBackground() { 
    var semaphores = [dispatch_semaphore_t]() 

    for delay in [2, 3, 10, 7] { 
     var semaphore = dispatch_semaphore_create(0) 
     semaphores.append(semaphore) 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
      sleep(UInt32(delay)) 
      println("Task took \(delay) seconds") 

      dispatch_semaphore_signal(semaphore) 
     } 
    } 

    for semaphore in semaphores { 
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
    } 
} 

ten jest bardzo podobny do tego, co masz. Moja "kolejka" pracy to zestaw sekund do snu, dzięki czemu można zobaczyć, że wszystko dzieje się w tle.

Należy pamiętać, że to po prostu uruchamia wszystkie zadania w tle. Jeśli chcesz ograniczyć liczbę aktywnych zadań do, na przykład, liczby rdzeni procesora, musisz wykonać nieco więcej pracy.

Nie jestem pewien, czy tego właśnie szukasz, daj mi znać.

+0

Może moje pytanie było niejasne, ale to jest dokładnie to, co napisałem powyżej. Dzięki za Twój wpis! –

+0

Mój przykład działa. Czego brakuje? Myślę, że to odpowiada na twoje pytanie? –

+0

Jestem pewien, że twój kod działa, ale twój kod jest prawie taki sam jak mój, nie dodając niczego. –

Powiązane problemy