Sie müssen irgendeine Art von Koordination tun, um zu bestimmen, wann alle Ihre Arbeit beendet ist . Sie können, dass die Koordination ziehen ziemlich leicht in den Haupt-Thread aus:
(def book_channel (chan 10))
(defn concurrency_test
[list_of_isbns]
(doseq [isbn list_of_isbns]
(go (>! book_channel
(get_title_and_rank_for_one_isbn
(amazon_search isbn)))))
(prn (loop [results []]
(if (= (count results) (count list_of_isbns))
results
(recur (conj results (<!! book_channel)))))))
Hier habe ich eine Schleife verwendet, die für die Ergebnisse immer wieder warten und das Hinzufügen von ihnen zu dem Vektor, bis wir so viele Ergebnisse haben, wie wir ISBN-Nummern zu tun. Sie sollten sicherstellen, dass get_title_and_rank_for_one_isbn
immer ein Ergebnis erzeugt, das auf einen Kanal gesetzt werden kann, andernfalls wartet die Schleife für immer.
Schließen Sie book_channel irgendwo? –
Wo würde (close! Book_channel) gehen? Ich bin verwirrt. – lalakers4life
Sie sollten schließen! der book_channel, nachdem du doseq beendet hast – rmcv