我使用http://fssnip.net/3K.我发现
-
我想在末尾添加"System.Console.ReadLine((|>ignore"以等待线程结束。是否可以告知所有MailBoxProcessors都已完成,程序可以自行退出?
-
我试图将测试url"www.google.com"更改为无效url,得到了以下输出。有可能避免"输出竞赛"吗?
http://www.google.co1m已由代理1爬网。AgAAAent试剂3完成。代理2完成。5完成。代理4完成。代理USsupervisor RL收集器已完成。完成。1完成。
[编辑]
使用Tomas的更新后,最后一次输出/爬网仍然终止http://fssnip.net/65.以下是我将"限制"更改为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]">永远不会执行,除非我在末尾添加了Console.Readline((。
[编辑2]
代码在fsi下运行良好。但是,如果使用fsi--use:Program.fs--exec--quiet
我创建了一个片段,用您询问的两个功能扩展了前一个片段:http://fssnip.net/65.
-
为了解决这个问题,我添加了携带
AsyncReplyChannel<unit>
的Start
消息。当主管代理启动时,它会等待此消息,并保存回复通道以供以后使用。当它完成时,它会使用此通道发送一个回复。启动代理的函数返回等待答复的异步工作流。然后,您可以使用
Async.RunSynchronously
调用crawl
,这将在主管代理完成时完成。 -
为了避免打印时出现竞争,您需要同步所有打印。最简单的方法是编写一个新的代理:-(。代理接收字符串,并将它们逐个打印到输出中(这样它们就不能交错(。该代码段使用一个向代理发送字符串的新实现来隐藏标准
printfn
函数。