Re: how goeth the STM experiment?

2015-05-10 Thread piastkrakow


 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?

2015-05-09 Thread Andrey Antukh
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?

2015-05-08 Thread piastkrakow
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?

2015-05-06 Thread Raoul Duke
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?

2015-05-06 Thread James Reeves
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?

2015-05-06 Thread Alex Miller
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?

2015-05-06 Thread Surgo
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?

2015-05-05 Thread Raoul Duke
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.