On Dec 18, 10:10 pm, Chouser <[email protected]> wrote:
> On Thu, Dec 18, 2008 at 3:07 PM, Stephan Mühlstrasser
>
> <[email protected]> wrote:
>
> > The following is my attempt to start a sub-process and to pass through
> > stdout and stderr. The shell command prints out 1000 lines "hello"
> > and a final "command finished". The problem is that nothing is printed
> > by the Clojure program. If I increase the number of lines for example
> > to 2000 (change "head -1000" to "head -2000"), I see a lot of output,
> > but it is cut off somewhere in the middle and the final "command
> > finished" does never appear.
>
> This is just a buffering/flushing problem. Try adding
> (.flush ostream) after your (.println ...)
Thanks, that was it! I put the flush in the else clause in copy, so it
flushes once at the end.
> > Is this use of agents incorrect?
>
> Since the action you're sending could block on IO, you should use
> 'send-off' instead of 'send'. The difference is that the pool of
> threads used by 'send' doesn't grow with demand, so too many blocking
> threads could cause new 'send' calls to queue up unnecessarily.
Ah, I believe I finally understand the difference between send and
send-off. To describe it in my own words, send-off creates a new
thread each time, while send schedules to a thread in a thread pool.
So this is the complete example again which now does work as expected:
(use 'clojure.contrib.duck-streams)
(defn copy
[istream ostream]
(println "copy" istream ostream)
(loop [line (.readLine istream)]
(if line
(do
(.println ostream line)
(recur (.readLine istream)))
(.flush ostream))))
(let [pb (new ProcessBuilder ["sh" "-c" "yes hello | head -1000; echo
command finished"])
proc (.start pb)
stdout (reader (.getInputStream proc))
stderr (reader (.getErrorStream proc))
stdout-agent (agent stdout)
stderr-agent (agent stderr)]
(send-off stdout-agent copy (writer *out*))
(send-off stderr-agent copy (writer *err*))
(await stdout-agent stderr-agent)
(.waitFor proc)
(shutdown-agents)
(println "done"))
Thanks
Stephan
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---