3

http://fssnip.net/3Kのコードを使用してコンソール プログラムを作成しました。そして、私はそれを見つけました

  1. 最後に「System.Console.ReadLine() |> ignore」を追加して、スレッドの終了を待ちます。すべての MailBoxProcessors が完了し、プログラムが終了できることを確認できますか?

  2. テストURL「www.google.com」を無効なURLに変更しようとしたところ、次の出力が得られました。「出力競争」を回避することはできますか?

     http://www.google.co1m がエージェント 1 によってクロールされました。  
     AgAAAent gent 3 が完了しました。  
     gent 2 が完了しました。  
     5 完了です。  
     ジェント4が完成しました。  
     エージェント USupervisor 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"

ただし、最後に Console.Readline() を追加しない限り、最後のprintfn "[Main] after crawl"は実行されません。

[編集2]

コードは fsi の下で問題なく動作します。ただし、 fsi --use:Program.fs --exec --quiet を使用して実行した場合、同じ問題が発生します。

4

1 に答える 1

5

あなたが尋ねた2つの機能で前のものを拡張するスニペットを作成しました: http://fssnip.net/65 .

  1. これを解決するために、 を含むStartメッセージを追加しましたAsyncReplyChannel<unit>。スーパーバイザ エージェントが起動すると、このメッセージを待機し、後で使用するために応答チャネルを保存します。完了すると、このチャネルを使用して応答を送信します。

    エージェントを開始する関数は、応答を待機する非同期ワークフローを返します。crawlその後、 を使用して呼び出すことができますAsync.RunSynchronously。これは、スーパーバイザ エージェントが完了すると完了します。

  2. 印刷時の競合を避けるには、すべての印刷を同期する必要があります。これを行う最も簡単な方法は、新しいエージェントを作成することです:-)。エージェントは文字列を受け取り、それらを 1 つずつ出力に出力します (インターリーブできないようにするため)。このスニペットは、printfn文字列をエージェントに送信する新しい実装で標準関数を隠しています。

于 2011-07-02T13:16:10.050 に答える