I'm experimenting with ref, dosync, and alter to run some code in parallel,
but so far haven't been able to figure out how to structure it such that it
runs faster, instead of slower.
The problem looks something like this.
The current state is a long vector. Input is a long sequence of values. At
each step some positions in the vector are populated, if empty, based on
computations over the next value in the sequence.
It's like placing puzzle pieces: search for positions that satisfy a
constraint, and fill them.
Using threads, I'd like to place the next several values in parallel. But
running in parallel it's possible that two threads would find solutions
that conflict. In this case, the latter one must continue searching.
Is there a way to express this with clojure? The problem is that I can't
tell 'dosync' when a previous transaction invalidates the current
transaction: it just always retries.
e.g. if each thread is doing
(dosync
(let [positions (find-positions next-value @state)]
(alter state (fn [s] (update-state s positions))))))
they interfere with each other constantly, because any write to 'state'
causes the other threads to retry, even if their positions are still free.
One really wants to reverse the order of find-positions and dosync here, so
it computes positions, then tries to commit them, checking in the
transaction that the positions are still free, and continuing the search if
they're not.
I suppose there's some solution involving exceptions. Is there a better way
to think about this?
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.