1

Erlang WebフレームワークであるNitrogenを使用して、メッセージを受信し、それらをhtml要素の下部に追加する次のメソッドがあります。

receive_messages() ->
  receive
    Message ->
      io:format("~p received ~p", [self(), Message]),
      wf:insert_bottom(messages, [#p{}, #span { text=io_lib:format("~p", [Message]) }])
  end,
  wf:comet_flush(),
  receive_messages().

これは、彗星の通常の方法として設定されています。

wf:comet(fun() -> receive_messages() end)

2つのメッセージを非常にすばやく受信します。

<0.907.0> received {starting_chat,<0.905.0>}
<0.907.0> received {connected_to,<0.902.0>}

これは私がHTMLで見るものです:

{connected_to, <0.902.0>}
{starting_chat, <0.905.0>}

どういうわけか、彼らは逆の順序で終わった。

このメソッドにtimer:sleep()呼び出しを追加し始めました。50ミリ秒では正しい順序になり、20ミリ秒では正しくありません。それらが間違った順序にある​​とき、それらは常に間違った順序にある​​ように見えます、それは非常に決定論的であるように見えます。

なぜ何かアイデアはありますか?これはバグですか?寝る以外に正しい順序でそれらを取得するために私は何をすべきか考えていますか?

そこにもっと情報がある場合に備えて、メーリングリストでも尋ねられます。

4

1 に答える 1

1

wf_comet.erlには、inner_collect_contentを適用した後の「奇妙な」逆呼び出しがあります。私の推測では、inner_collect_contentは以前は末尾再帰でした。

タイムアウトを適用すると、メッセージは1つずつ異なるループで収集されるため、順序が逆になることはありません。


別のリポジトリでこれを修正するコミットがあるようです:

http://github.com/gersh/nitrogen/commit/a8bfcb23d003e68f7394a0455285beeb0fbf9b09

于 2010-01-04T22:16:11.883 に答える