Pytanie Co to jest "await do" w Perlu 6?


Widzę następujący kod w Perlu 6:

await do for @files -> $file {
    start {
       #do something ...    }
}

który działa w trybie asynchronicznym. Dlaczego powyższy kod jest potrzebny do? Jaki jest cel do w Perlu 6? Czy ktoś mógłby wyjaśnić szczegółowo powyższy kod?

Istnieje również możliwość napisania czegoś takiego:

for @files -> $file {
    start {
       #do something ...    }
}

i czekać po kodzie, aby obietnice się spełniły?


10
2017-11-23 10:12


pochodzenie




Odpowiedzi:


Cel do

The for słowo kluczowe można wykorzystać na dwa różne sposoby:

1) Jako samodzielne wyrażenie blokowe:

for 1..5 { say $_ }

2) Jako modyfikator instrukcji dodawany na końcu instrukcji:

say $_ for 1..5;

Kiedy gołe for słowo kluczowe pojawia się w środku większego zdania, jest interpretowane jako druga forma.

Jeśli chcesz użyć formy blokowej wewnątrz większej instrukcji (np. Jako argumentu dla await funkcja), musisz poprzedzić go do aby poinformować analizator składni o tym, że uruchamiasz tutaj instrukcję blokującą, i chcesz uzyskać jej wartość zwracaną.

Bardziej ogólnie, do upewnia się, że następujące po nim są analizowane przy użyciu tych samych reguł, które zostałyby przeanalizowane, tak jakby były to własne instrukcje, i powoduje, że dostarcza ono wartości zwracanej. Dzięki temu możemy użyć dowolnej instrukcji jako wyrażenia wewnątrz większego wyciągu. do if, do whileitp. wszystkie działają w ten sam sposób.


Wyjaśnienie twojego kodu

Kod, który pokazałeś ...

await do for @files -> $file {
    start {
       #do somthing ...    }
}

... wykonuje następujące czynności:

  • Pętle ponad układem @files.
  • Dla każdej iteracji używa ona start słowo kluczowe, aby zaplanować asynchroniczne zadanie, które prawdopodobnie robi coś z bieżącym elementem $file. (The $*SCHEDULER zmienna decyduje, w jaki sposób zadanie jest faktycznie uruchamiane; domyślnie używa prostego programu planującego pule wątków.)
  • Każde wywołanie start natychmiast zwraca a Promise który zostanie zaktualizowany po zakończeniu zadania asynchronicznego.
  • The do for zbiera sekwencję wszystkich zwracanych wartości w ciele pętli (to jest obietnic).
  • The await Funkcja akceptuje tę sekwencję jako argument i czeka, aż wszystkie obietnice się spełnią.

Jak "poczekać po kodzie"

Nie jestem do końca pewien, co masz na myśli. Jeśli chcesz zapamiętać obietnice, ale nie możesz na nie czekać, po prostu przechowuj je w tablicy:

my @promises = do for @files -> $file {
    start {
       #do something ...    }
}

#other code ...

await @promises;

Nie ma wygodnej funkcjonalności w oczekiwaniu na wszystkie zaplanowane / uruchomione zadania. Zawsze musisz śledzić obietnice.


9
2017-11-23 12:11