zeromqまあまあ良い感じですね。jzmqだとライブラリのビルドが面倒だったのでjeromqにしましたがそれなりのパフォーマンスには。
ところでwith-openとcore.asyncを同時に使うとやばい、とかってありますか?
特にないと思います。
with-open下でgo使ったらリソースが既に閉じられていてエラーになったんですよね…何かマズかったんでしょうか。
goマクロの中でwith-openを呼ぶのは問題なさそうな気がしますけど、goマクロ自体はチャネルを返してくるだけで制御が戻ってきてしまうので、goマクロ内で外側のwith-openでオープンしたリソースにアクセスするとエラーになる可能性はありますね
with-openとlazy seqを一緒に使うのと似た問題かと
うーむ。一応with-open内に制御はとどまっているんですよね。ringのサーバを立ち上げているので。
うーん、状況が分からないのでなんとも…
(defn -main [& args]
(with-open [f (io/reader (first args))]
(let [routine (fuction-that-start-gorutine f)]
...
(run-server (site #'routes) {:port 8080}))))
function-that-start-goroutine
の戻り値は何ですか?
えーっと、内部で2つのgoroutine(タイマーと本スレッド)を作っていて、そのうちのタイマーです。
うーん、なんでしょう。仮に with-open
を使わずに (fuction-that-start-gorutine (io/reader (first args)))
とした場合はエラーにはならないんですか?
そうです。
なので今letで運用してるんですがちょっと気持ち悪いんですよね。
なるほど。たしかに気持ちは悪いですけど、そのファイルがサーバを落とすまで開きっぱなしでいいならそれでもいい気はします。
そうですね。とりあえずはこれでやっていきます。 原因が分からないのは気になるのでそれはまた調べますか。
もしかして run-server
って async ですか?
run-serverでブロックしますね。
ちなみにエラーメッセージはどんな感じですか?
closedSequenceみたいな…いまはもうエラー直してるのですぐには出ませんでしたね。
(lazy-seqとwith-openの時と同じエラーですね
サーバ何を使ってますか?http-kit?
そうです
http-kit の run-server
は async だと思いますよ。 run-server
の後 println
とかを入れてみてください。たぶん、そのせいだと思います。
なるほど…
確かにprintされました。ありがとうございます。