Я просматривал одну из записей блога Дона Сайма Асинхронные и параллельные шаблоны проектирования в F#: агенты. Однако следующий, казалось бы, очень простой код не генерировал ожидаемых результатов.
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 сообщений я получил около 3000 сообщений с использованием Mono 2.8.1 под Ubuntu или 15 сообщений с использованием Visual F# под Windows XP. Я что-то пропустил здесь? Кстати, я попытался заменить оператор printfn следующей операцией с файлом и получил те же частичные результаты.
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)