我使用来自http://fssnip.net/3K的代码创建了一个控制台程序。我发现
我要在末尾添加“System.Console.ReadLine() |> ignore”以等待线程完成。是否可以告诉所有 MailBoxProcessor 都已完成并且程序可以自行退出?
我试图将测试网址“www.google.com”更改为无效的网址,并得到以下输出。能否避免“输出竞赛”?
代理 1 抓取的 http://www.google.co1m。 AgAAAent gent 3 完成。 绅士2完成了。 5 完成。 绅士4完成了。 代理 USupervisor RL 收集器完成。 已经完成了。 1 完成。
[编辑]
使用 Tomas 的更新http://fssnip.net/65后,最后的输出/爬网仍然终止。以下是我将“limit”改为5并添加一些调试信息后程序的输出。最后一行显示截断的 URL。这是一种检测所有爬虫是否完成执行的方法吗?
[Main] before crawl
[Crawl] before return result
http://news.google.com crawled by agent 1.
[supervisor] reached limit
http://www.gstatic.com/news/img/favicon.ico crawled by agent 5.
Agent 2 is done.
[supervisor] reached limit
Agent 5 is done.
http://www.google.com/imghp?hl=en&tab=ni crawled by agent 3.
[supervisor] reached limit
Agent 3 is done.
http://www.google.com/webhp?hl=en&tab=nw crawled by agent 4.
[supervisor] reached limit
Agent 4 is done.
http://news.google.com/n
我将主要代码更改为
printfn "[Main] before crawl"
crawl "http://news.google.com" 5
|> Async.RunSynchronously
printfn "[Main] after crawl"
但是,最后一个printfn "[Main] after crawl"永远不会执行,除非我在最后添加一个 Console.Readline() 。
[编辑 2]
代码在 fsi 下运行良好。但是,如果使用 fsi --use:Program.fs --exec --quiet 运行它也会有同样的问题