clojure-japan 2016-02-19

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されました。ありがとうございます。

👏 1