Help with async operations

2015-05-16 Thread Oleg Dashevskii
Hi,

I’m new to Clojure async operations (while have a good understanding of 
other things) and want to get a bit of advice. Atoms & agents still confuse 
me.

What I’m implementing is a small REST webservice with custom in-memory 
database. Database is indexed by unique key, basically it’s a map (I’ll 
denote it as MAP). There are two basic operations:

*PUT /api/…/.* Initiate an update for given KEY. The HTTP response 
should be returned immediately, and the processing should be done 
asynchronously. The processing consists of downloading a data file from web 
and doing some data crunching, the result should go into MAP.

*GET /api/…/.* Use (get MAP KEY) and request params to generate 
response synchronously.

The tricky part (well, for me :) is that parallel PUT requests should be 
possible. The downloading and processing can and should go in parallel, 
independently, whereas updating the MAP should come synchronized, 
one-after-the-other.

How would you implement this?

--
Oleg.

-- 
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: Help with async operations

2015-05-17 Thread Oleg Dashevskii
Hi Atamert,

воскресенье, 17 мая 2015 г., 19:35:57 UTC+6 пользователь Atamert Ölçgen 
написал:
>
> I’m new to Clojure async operations (while have a good understanding of 
>> other things) and want to get a bit of advice. Atoms & agents still confuse 
>> me.
>>
>> What I’m implementing is a small REST webservice with custom in-memory 
>> database. Database is indexed by unique key, basically it’s a map (I’ll 
>> denote it as MAP). There are two basic operations:
>>
>> *PUT /api/…/.* Initiate an update for given KEY. The HTTP response 
>> should be returned immediately, and the processing should be done 
>> asynchronously. The processing consists of downloading a data file from web 
>> and doing some data crunching, the result should go into MAP.
>>
>> *GET /api/…/.* Use (get MAP KEY) and request params to generate 
>> response synchronously.
>>
>> The tricky part (well, for me :) is that parallel PUT requests should be 
>> possible. The downloading and processing can and should go in parallel, 
>> independently, whereas updating the MAP should come synchronized, 
>> one-after-the-other.
>>
>> How would you implement this?
>>
>
> While this can be done with atoms & agents, perhaps you should check out 
> core.async or Lamina first.
>
> Neither atoms nor agents can be updated in a parallel manner. Only one 
> update runs on a single atom/agent at a given time. If you really need 
> parallelism and the updates affect small parts of MAP, perhaps you can 
> model it using refs, but then it's not one big map anymore. (Still you 
> can't update a single ref in more than one thread at the same time.)
>
> You probably also want to control how the files are downloaded and 
> processed, so that there's not duplication of effort. So an event driven 
> solution seems to fit this problem.
>

In fact, I don't use the MAP as a whole, each read/update operation is 
scoped by KEY. So a map of refs sounds good.

Speaking of event driven solution and core.async. I came up with the 
following scheme:

[PUT request handler] > processing queue channel > Download/process 
> update queue channel > [updating the MAP].

*[updating the MAP]* is basically a (go ...) block which does synchronous 
updates.

-- 
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: Help with async operations

2015-05-25 Thread Oleg Dashevskii
Hi Rangel,

thanks! works perfectly!

понедельник, 18 мая 2015 г., 4:07:53 UTC+6 пользователь Rangel Spasov 
написал:
>
> You can checkout the new pipeline stuff, I think it fits what you're 
> looking for nicely:
>
> https://gist.github.com/raspasov/7c9d8f2872d6065b2145
>
>

-- 
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.