2

私は Don Syme のブログ記事Async and Parallel Design Patterns in F#: Agentsの 1 つを読んでいました。ただし、次の一見非常に単純なコードでは、期待どおりの出力が生成されませんでした。

type Agent<'T> = MailboxProcessor<'T>

let agent =
   Agent.Start(fun inbox ->
     async { while true do
               let! msg = inbox.Receive()
               printfn "got message '%s'" msg } )

for i in 1 .. 10000 do
   agent.Post (sprintf "message %d" i)

予想される 10,000 メッセージの代わりに、Ubuntu で Mono 2.8.1 を使用して約 3000 メッセージ、または Windows XP で Visual F# を使用して 15 メッセージしか受け取りませんでした。ここで何か不足していますか?ところで、printfn ステートメントを次の File op に置き換えようとしたところ、同じ部分的な結果になりました。

open System.IO
type Agent<'T> = MailboxProcessor<'T>

let agent =
   Agent.Start(fun inbox ->
     async { while true do
               let! msg = inbox.Receive()
               use logger = new StreamWriter("a.log", true)
               logger.WriteLine("got message '{0}'", msg.ToString())
               logger.Close() 
           } )

for i in 1 .. 10000 do
   agent.Post (sprintf "message %d" i)
4

1 に答える 1

5

コードを Win マシンで実行するだけで、すべて問題ありません。追加してみる

ignore( System.Console.ReadKey() )

agent.Post はノンブロッキングであり、10000 件のメッセージをポストした後、制御フローが前進し、プログラムを終了する可能性があるため、最後の行として。

于 2011-03-01T16:17:42.193 に答える