2011-07-02 79 views
3

我使用http://fssnip.net/3K的代碼創建了一個控制檯程序。我發現F#郵箱處理器問題

  1. 我想添加「System.Console.ReadLine()|>忽略」在最後等待線程的完成。是否有可能告訴所有的MailBoxProcessors完成並且程序可以退出?

  2. 我試圖將測試網址「www.google.com」更改爲無效的網址,我得到了以下輸出。是否有可能避免「輸出競賽」?

 
    http://www.google.co1m crawled by agent 1. 
    AgAAAent gent 3 is done. 
    gent 2 is done. 
    5 is done. 
    gent 4 is done. 
    Agent USupervisor RL collector is done. 
    is done. 
    1 is done. 

[編輯]

最後輸出/爬行仍終止使用托馬斯的更新後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 「[主要]抓取後」從不執行,除非我添加到Console.ReadLine()在端。

[編輯2]

代碼在fsi下運行正常。但它會有相同的問題,如果它運行使用 fsi --use:Program.fs --exec --quiet

+0

對我來說,這種使用郵箱處理器來解決URL的爬行過於複雜,URL的內容獲取也不是異步調用。使用簡單的異步計算可以輕鬆解決問題。 – Ankur

回答

5

我創建了一個片段,擴展與您問的兩個功能的前一個:http://fssnip.net/65

  1. 爲了解決這一點,我添加Start消息攜帶AsyncReplyChannel<unit>。當監督員代理啓動時,它會等待此消息並保存回覆通道供以後使用。完成後,它會使用此頻道發送回覆。

    啓動代理的功能返回等待回覆的異步工作流。然後,您可以使用Async.RunSynchronously撥打crawl,當監督員代理完成時,該工作將完成。

  2. 爲了避免在打印時競爭,您需要同步所有打印件。最簡單的方法是編寫一個新的代理:-)。代理接收字符串並將它們逐個打印到輸出(以便它們不能交錯)。片段隱藏標準printfn函數與一個新的實現向代理髮送字符串。

+0

非常感謝。我編譯了代碼並在控制檯窗口中運行它。但是,通常有一個代理不能完成。例如, 代理1已完成。 https://www.google.com/accounts/ServiceLogin?service = news & passive = 1209600 & continue = http://news.google.com/ & followup = http://news.google.com/由代理程序5抓取。 代理程序5完成。 http://www.google.com/reader/?tab=ny被代理爬取4. 代理4已完成。 http://groups.google.com/grphp?hl=zh-CN&tab=ng代理爬取3. 代理3已完成。 http://sites.g C:\ Users \ nick \ Documents \ Visual Studio 2010 \ Projects \ WebCrawler \ WebCrawler \ bin \ Debug> – ca9163d9

+0

看起來格式在評論中混亂了。問題是最後一個輸出被截斷。例如,方括號中的字符可能會被截斷。 http://groups.go [ogle代理服務器N抓取ogle.cn/grphp?hl=zh-CN&tab=ng] – ca9163d9