wenn Sie die Anrufe future
sequentialisieren möchten, können Sie es manuell wie folgt verwenden:
(do @(future 1)
@(future 2)
@(future 3))
sie würden möglicherweise noch in verschiedenen Threads aufgerufen, aber der nächste wird erst aufgerufen werden das vorherige ist beendet. Dies wird durch die Funktion @
(oder deref
) garantiert. Dies bedeutet, dass der Thread, in dem Sie das Formular do
ausführen, vor dem Abschluss mit "prev promise" blockiert wird und dann den nächsten spawnt.
Sie können es mit Makro wie folgt prettify:
(defmacro sequentialize [& futures]
`(do [email protected](map #(list `deref %) futures)))
user> (let [a (atom 1)]
(sequentialize
(future (swap! a #(* 10 %)))
(future (swap! a #(+ 20 %)))
(future (swap! a #(- %))))
@a)
;;=> -30
dies tut genau das gleiche wie manuelle do
. Beachten Sie, dass Mutationen a
Atom sind in Ordnung, auch wenn einige Threads laufen länger:
user> (let [a (atom 1)]
(sequentialize
(future (Thread/sleep 100)
(swap! a #(* 10 %)))
(future (Thread/sleep 200)
(swap! a #(+ 20 %)))
(future (swap! a #(- %))))
@a)
;;=> -30
Warum würden Sie wollen Konstrukte schaffen, die für die Parallelität ausgelegt sind, nur um zu erzwingen, dass sie ausführen nicht gleichzeitig? Vielleicht haben Sie bereits vorhandene Aufgaben auf diese Weise definiert, oder Sie führen sie normalerweise gleichzeitig aus, möchten jedoch die sequenzielle Ausführung für eine begrenzte Zeit erzwingen? Nur neugierig. – Josh
Angenommen, es gibt mehrere Threads (z. B. Threads auf einem Server anfordern), die Tasks ausführen möchten, die eine freigegebene Ressource X verwenden, die jeweils nur von einem Thread verwendet werden kann. Eine Lösung besteht darin, eine Sperre zu greifen, wenn auf X zugegriffen wird. Eine andere Möglichkeit besteht darin, Tasks (Futures) für einen mit X verknüpften Thread zu senden. Die anderen aufrufenden Threads warten möglicherweise nicht auf das Ergebnis der Zukunft. –
Sicher, aber warum in diesem Fall überhaupt Threads erstellen? Warum nicht einfach die Aufgaben als Funktionen aus einem einzigen Thread aufrufen? – Josh