Would this not scale badly? When the vector is hundreds of thousands, or millions?
On Monday, January 30, 2017 at 5:54:32 PM UTC-8, tbc++ wrote: > > Instead of looking at the state as a ref with a vector in it, think of it > as a vector of refs. That then allows multiple refs to be modified at once > without stepping on other unrelated refs. > > On Mon, Jan 30, 2017 at 5:26 PM, Brian Craft <craft...@gmail.com > <javascript:>> wrote: > >> 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 clo...@googlegroups.com >> <javascript:> >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+u...@googlegroups.com <javascript:> >> 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 clojure+u...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > > > -- > “One of the main causes of the fall of the Roman Empire was that–lacking > zero–they had no way to indicate successful termination of their C > programs.” > (Robert Firth) > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.