Yesterday I had a problem that
core.async provides an incredibly neat
solution to. Tim Baldridge was kind enough to sanity check it for me,
so I thought I’d write it up.
Imagine you want to process a message at a maximum rate of one per second. In another language you’d probably say something like:
while true: start_time = date() process_message(queue) end_time = date() elapsed_time = end_time.subtract(start_time) if elapsed_time < 1000 sleep(1000 - elapsed_time)
Not hard to write, of course, but kinda clumsy. Here’s the
(while true (let [t (timeout 1000)] (process-message queue) (<!! t)))
In English, pick up a ticket that lasts for 1000 milliseconds; process a message; wait until the ticket expires. If processing the message took more than 1000ms, the ticket returns immediately, otherwise it blocks for the remaining time.
Simple and easy. A really neat solution.