Когда я запускаю код Clojure из реплик Swank в emacs, основной поток будет распечатывать сообщения, используя printf для реплики.Но если я запускаю агенты или явно создаю другие потоки, которые также печатают, иногда выходные данные не отображаются, а иногда отображаются в окне консоли, где я запускаю Swank.Мне бы очень хотелось понять, почему.
Редактировать: Благодаря ответу Даниэля ниже я теперь знаю, что другие потоки не имеют out , привязанного к выходу REPL.Этот код работает, потому что вы передаете из , откуда вы бежите.Однако моя новая проблема заключается в том, что этот код теперь блокируется для каждого потока, поэтому вместо параллельной работы он запускает каждый поток по одному, поэтому мне нужен более понятный метод вывода.
(defn sleeper-thread [out id t]
"Sleep for time T ms"
(binding [*out* out]
(printf "%d sleeping for time %d\n" id t)
(Thread/sleep t)
(printf "%d slept\n" id)))
(defn test-threads [n out]
(dotimes [x n]
(.start (Thread. (#(sleeper-thread %1 %2 %3) out x (+ 2000 (rand-int 5000)))))))