Re: how goeth the STM experiment?
An other thing when I have used with agents is implement an async interface for jdbc like applications. I have a little explication on how it is done here: http://funcool.github.io/suricatta/latest/#_async_interface That is an impressive bit of documentation. Thank you. On Saturday, May 9, 2015 at 3:33:15 AM UTC-4, Andrey Antukh wrote: Hi! Personally, I do not have the opportunity to use refs, but atoms and agens I have used it in different ways I have used agents for logging system, thanks to its guarantees of execution functions in a serial way. This allows heavy multithreading applications put logs to stdout (or any other destination) and have as result a consistent log. An other thing when I have used with agents is implement an async interface for jdbc like applications. I have a little explication on how it is done here: http://funcool.github.io/suricatta/latest/#_async_interface I hope you find it useful. Cheers. Andrey 2015-05-09 3:56 GMT+02:00 piast...@gmail.com javascript:: This seems to be true: I would have to say that the biggest surprise is how little they're needed in Clojure. Run this search on Google: agent send clojure site:github.com The first 5 pages point me to examples from several years ago, or error reports, or unit tests. Nothing substantial or recent. I think it is interesting how many of the results are blog posts or gists -- people talk about agents much more then they actually use them. Still, there are some examples: https://github.com/aphyr/riemann/blob/302cff942f308771b1d8d837cdf9ce2c9090daed/src/riemann/pool.clj (defmacro with-pool Evaluates body in a try expression with a symbol 'thingy claimed from the given pool, with specified claim timeout. Releases thingy at the end of the body, or if an exception is thrown, invalidates them and rethrows. Example: ; With client, taken from connection-pool, waiting 5 seconds to claim, send ; client a message. (with-pool [client connection-pool 5] (send client a-message)) [[thingy pool timeout] body] ; Destructuring bind could change nil to a, say, vector, and cause ; unbalanced claim/release. `(let [thingy# (claim ~pool ~timeout) ~thingy thingy#] (try (let [res# (do ~@body)] (release ~pool thingy#) res#) (catch Throwable t# (invalidate ~pool thingy#) (throw t#) And: https://github.com/clojure/java.jmx/blob/master/src/main/clojure/clojure/java/jmx.clj (deftype Bean [state-ref] DynamicMBean (getMBeanInfo [_] (MBeanInfo. (.. _ getClass getName) ; class name Clojure Dynamic MBean ; description ( map-attribute-infos @state-ref) ; attributes nil ; constructors nil ; operations nil)) (getAttribute [_ attr] (@state-ref (keyword attr))) ( getAttributes [_ attrs] (let [result (AttributeList.)] (doseq [attr attrs] (.add result (Attribute. attr (.getAttribute _ attr result)) ( setAttribute [_ attr] (let [attr-name (.getName attr) attr-value ( .getValue attr) state-update {(keyword attr-name) attr-value}] (condp = ( type state-ref) clojure.lang.Agent (await (send state-ref (fn [state state-update] (merge state state-update)) state-update)) clojure.lang.Atom (swap! state-ref merge state-update) clojure.lang.Ref (dosync (ref-set state-ref (merge @state-ref state-update)) (setAttributes [_ attrs] ( let [attr-names (map (fn [attr] (.setAttribute _ attr) (.getName attr)) attrs)] (.getAttributes _ (into-array attr-names) I would love to see some other examples. On Wednesday, May 6, 2015 at 9:49:47 PM UTC-4, Surgo wrote: I'm not saying this is everyone's experience o ... -- 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.
Re: how goeth the STM experiment?
Hi! Personally, I do not have the opportunity to use refs, but atoms and agens I have used it in different ways I have used agents for logging system, thanks to its guarantees of execution functions in a serial way. This allows heavy multithreading applications put logs to stdout (or any other destination) and have as result a consistent log. An other thing when I have used with agents is implement an async interface for jdbc like applications. I have a little explication on how it is done here: http://funcool.github.io/suricatta/latest/#_async_interface I hope you find it useful. Cheers. Andrey 2015-05-09 3:56 GMT+02:00 piastkra...@gmail.com: This seems to be true: I would have to say that the biggest surprise is how little they're needed in Clojure. Run this search on Google: agent send clojure site:github.com The first 5 pages point me to examples from several years ago, or error reports, or unit tests. Nothing substantial or recent. I think it is interesting how many of the results are blog posts or gists -- people talk about agents much more then they actually use them. Still, there are some examples: https://github.com/aphyr/riemann/blob/302cff942f308771b1d8d837cdf9ce2c9090daed/src/riemann/pool.clj (defmacro with-pool Evaluates body in a try expression with a symbol 'thingy claimed from the given pool, with specified claim timeout. Releases thingy at the end of the body, or if an exception is thrown, invalidates them and rethrows. Example: ; With client, taken from connection-pool, waiting 5 seconds to claim, send ; client a message. (with-pool [client connection-pool 5] (send client a-message)) [[thingy pool timeout] body] ; Destructuring bind could change nil to a, say, vector, and cause ; unbalanced claim/release. `(let [thingy# (claim ~pool ~timeout) ~thingy thingy#] (try (let [res# (do ~@body)] (release ~pool thingy#) res#) (catch Throwable t# (invalidate ~pool thingy#) (throw t#) And: https://github.com/clojure/java.jmx/blob/master/src/main/clojure/clojure/java/jmx.clj (deftype Bean [state-ref] DynamicMBean (getMBeanInfo [_] (MBeanInfo. (.. _ getClass getName) ; class name Clojure Dynamic MBean ; description ( map-attribute-infos @state-ref) ; attributes nil ; constructors nil ; operations nil)) (getAttribute [_ attr] (@state-ref (keyword attr))) ( getAttributes [_ attrs] (let [result (AttributeList.)] (doseq [attr attrs] (.add result (Attribute. attr (.getAttribute _ attr result)) ( setAttribute [_ attr] (let [attr-name (.getName attr) attr-value ( .getValue attr) state-update {(keyword attr-name) attr-value}] (condp = ( type state-ref) clojure.lang.Agent (await (send state-ref (fn [state state-update] (merge state state-update)) state-update)) clojure.lang.Atom (swap! state-ref merge state-update) clojure.lang.Ref (dosync (ref-set state-ref (merge @state-ref state-update)) (setAttributes [_ attrs] ( let [attr-names (map (fn [attr] (.setAttribute _ attr) (.getName attr)) attrs)] (.getAttributes _ (into-array attr-names) I would love to see some other examples. On Wednesday, May 6, 2015 at 9:49:47 PM UTC-4, Surgo wrote: I'm not saying this is everyone's experience or anything, but at times I have at times considered some deeper STM-work with agents but I could not seem to penetrate the documentation at the time. I do not know if it's different now -- Morgon On Wednesday, May 6, 2015 at 5:38:08 PM UTC-4, James Reeves wrote: On 6 May 2015 at 21:58, Alex Miller al...@puredanger.com wrote: I would have to say that the biggest surprise is how little they're needed in Clojure. The combination of immutable data, functions to update complex data structures, and fast pure function updates with atoms actually satisfies a large percentage of real use cases. I'll echo this. I've been using Clojure for years, and I can't recall ever needing refs (or agents for that matter). - James -- 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. -- Andrey Antukh - Андрей Антух - andrei.anto...@kaleidos.net / n...@niwi.be http://www.niwi.be http://www.niwi.be/page/about/ https://github.com/niwibe -- 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
Re: how goeth the STM experiment?
This seems to be true: I would have to say that the biggest surprise is how little they're needed in Clojure. Run this search on Google: agent send clojure site:github.com The first 5 pages point me to examples from several years ago, or error reports, or unit tests. Nothing substantial or recent. I think it is interesting how many of the results are blog posts or gists -- people talk about agents much more then they actually use them. Still, there are some examples: https://github.com/aphyr/riemann/blob/302cff942f308771b1d8d837cdf9ce2c9090daed/src/riemann/pool.clj (defmacro with-pool Evaluates body in a try expression with a symbol 'thingy claimed from the given pool, with specified claim timeout. Releases thingy at the end of the body, or if an exception is thrown, invalidates them and rethrows. Example: ; With client, taken from connection-pool, waiting 5 seconds to claim, send ; client a message. (with-pool [client connection-pool 5] (send client a-message)) [[thingy pool timeout] body] ; Destructuring bind could change nil to a, say, vector, and cause ; unbalanced claim/release. `(let [thingy# (claim ~pool ~timeout) ~thingy thingy#] (try (let [res# (do ~@body)] (release ~pool thingy#) res#) (catch Throwable t# (invalidate ~pool thingy#) (throw t#) And: https://github.com/clojure/java.jmx/blob/master/src/main/clojure/clojure/java/jmx.clj (deftype Bean [state-ref] DynamicMBean (getMBeanInfo [_] (MBeanInfo. (.. _ getClass getName) ; class name Clojure Dynamic MBean ; description ( map-attribute-infos @state-ref) ; attributes nil ; constructors nil ; operations nil)) (getAttribute [_ attr] (@state-ref (keyword attr))) ( getAttributes [_ attrs] (let [result (AttributeList.)] (doseq [attr attrs] ( .add result (Attribute. attr (.getAttribute _ attr result)) ( setAttribute [_ attr] (let [attr-name (.getName attr) attr-value (.getValue attr) state-update {(keyword attr-name) attr-value}] (condp = (type state-ref) clojure.lang.Agent (await (send state-ref (fn [state state-update] (merge state state-update)) state-update)) clojure.lang.Atom ( swap! state-ref merge state-update) clojure.lang.Ref (dosync (ref-set state-ref (merge @state-ref state-update)) (setAttributes [_ attrs] (let [attr-names (map (fn [attr] (.setAttribute _ attr) (.getName attr)) attrs)] (.getAttributes _ (into-array attr-names) I would love to see some other examples. On Wednesday, May 6, 2015 at 9:49:47 PM UTC-4, Surgo wrote: I'm not saying this is everyone's experience or anything, but at times I have at times considered some deeper STM-work with agents but I could not seem to penetrate the documentation at the time. I do not know if it's different now -- Morgon On Wednesday, May 6, 2015 at 5:38:08 PM UTC-4, James Reeves wrote: On 6 May 2015 at 21:58, Alex Miller al...@puredanger.com wrote: I would have to say that the biggest surprise is how little they're needed in Clojure. The combination of immutable data, functions to update complex data structures, and fast pure function updates with atoms actually satisfies a large percentage of real use cases. I'll echo this. I've been using Clojure for years, and I can't recall ever needing refs (or agents for that matter). - James -- 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.
Re: how goeth the STM experiment?
Thanks for the thoughts! If anybody also has any other STM experience (e.g. Haskell?) to compare/contrast, that would be nifty to hear. -- 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.
Re: how goeth the STM experiment?
On 6 May 2015 at 21:58, Alex Miller a...@puredanger.com wrote: I would have to say that the biggest surprise is how little they're needed in Clojure. The combination of immutable data, functions to update complex data structures, and fast pure function updates with atoms actually satisfies a large percentage of real use cases. I'll echo this. I've been using Clojure for years, and I can't recall ever needing refs (or agents for that matter). - James -- 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.
Re: how goeth the STM experiment?
I would have to say that the biggest surprise is how little they're needed in Clojure. The combination of immutable data, functions to update complex data structures, and fast pure function updates with atoms actually satisfies a large percentage of real use cases. For cases where you do need coordinated change, refs/STM are usually used with coarse granularity (way coarser than object level, more at component or subsystem level) so there are comparatively small numbers of them. Despite that, again immutable data + deep manipulation + fast pure function updates means that I can't think of ever hearing a report about issues with retries or anything like that in dosync transactions. If you need to, it's not particularly hard to tune the granularity of refs to achieve better performance, just by choosing where in a complex data structure you chop things up - generally things work well when they're pretty coarse though. On Tuesday, May 5, 2015 at 6:42:43 PM UTC-5, raould wrote: hi, What do people think of STM after all these years? What pros vs. cons are there - has the community evolved the list of them? thanks for any thoughts. -- 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.
Re: how goeth the STM experiment?
I'm not saying this is everyone's experience or anything, but at times I have at times considered some deeper STM-work with agents but I could not seem to penetrate the documentation at the time. I do not know if it's different now -- Morgon On Wednesday, May 6, 2015 at 5:38:08 PM UTC-4, James Reeves wrote: On 6 May 2015 at 21:58, Alex Miller al...@puredanger.com javascript: wrote: I would have to say that the biggest surprise is how little they're needed in Clojure. The combination of immutable data, functions to update complex data structures, and fast pure function updates with atoms actually satisfies a large percentage of real use cases. I'll echo this. I've been using Clojure for years, and I can't recall ever needing refs (or agents for that matter). - James -- 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.
how goeth the STM experiment?
hi, What do people think of STM after all these years? What pros vs. cons are there - has the community evolved the list of them? thanks for any thoughts. -- 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.