F# MailboxProcessor questions



我使用http://fssnip.net/3K.我发现

  1. 我想在末尾添加"System.Console.ReadLine((|>ignore"以等待线程结束。是否可以告知所有MailBoxProcessors都已完成,程序可以自行退出?

  2. 我试图将测试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.

  1. 为了解决这个问题,我添加了携带AsyncReplyChannel<unit>Start消息。当主管代理启动时,它会等待此消息,并保存回复通道以供以后使用。当它完成时,它会使用此通道发送一个回复。

    启动代理的函数返回等待答复的异步工作流。然后,您可以使用Async.RunSynchronously调用crawl,这将在主管代理完成时完成。

  2. 为了避免打印时出现竞争,您需要同步所有打印。最简单的方法是编写一个新的代理:-(。代理接收字符串,并将它们逐个打印到输出中(这样它们就不能交错(。该代码段使用一个向代理发送字符串的新实现来隐藏标准printfn函数。

相关内容

  • 没有找到相关文章

最新更新