2011-07-02 13 views
3

http://fssnip.net/3Kのコードを使用してコンソールプログラムを作成しました。スレッドの終了を待つ終わり|そして私はF#MailboxProcessorの質問

  1. 私は「>を無視()System.Console.ReadLine」を追加するだろうと分かりました。すべてのMailBoxProcessorsが完了したことを伝えることは可能ですか?プログラムは終了しますか?

  2. テストURL「www.google.com」を無効なURLに変更しようとしましたが、次のような結果が得られました。 「アウトプットレース」を避けることは可能ですか?

 
    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を使用した後に終了されます。以下は、 "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 

私は最後に)私はConsole.Readlineを(追加しない限りしかし、 "クロール後に[メイン]" 最後printfnは、実行されることはありません

printfn "[Main] before crawl" 
crawl "http://news.google.com" 5 
|> Async.RunSynchronously 
printfn "[Main] after crawl" 

にメインコードを変更。

[編集2]

コードはfsiで正常に動作します。しかし、それが同じ問題を抱えているのは、 fsiです。--use:Program.fs --exec --quiet

+0

、URLのクロールを解決するためのメールボックスプロセッサのこの使用法はまた、URLのコンテンツのフェッチが非同期呼び出しではない、あまりにも複雑です。問題は簡単な非同期計算を使用して簡単に解決できます。 – Ankur

答えて

5

あなたがお聞きした2つの機能を拡張したスニペットを作成しました:http://fssnip.net/65

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

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

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

+0

ありがとうございました。コードをコンパイルし、コンソールウィンドウで実行しました。しかし、通常はエージェントが終了できません。たとえば、 エージェント1が実行されます。 https://www.google.com/accounts/ServiceLogin?サービス=ニュース&パッシブ= 1209600 &継続= http://news.google.com/ &フォローアップ= http://news.google.com/エージェント5がクロールしました。 エージェント5が完了しました。 http://www.google.com/reader/?tab=nyエージェント4がクロールしました。 エージェント4が完了しました。 http://groups.google.com/grphp?hl=ja&tab=ng3でクロールしました。 エージェント3が完了しました。 http://sites.g C:¥Users¥nick¥Documents¥Visual Studio 2010¥Projects¥WebCrawler¥WebCrawler¥bin¥Debug> – ca9163d9

+0

コメントにはフォーマットが混乱しているようです。問題は、最後の出力が切り捨てられていることです。たとえば、角カッコ内の文字は切り捨てられます。 http://groups.go [ogle.com/grphp?hl=ja&tab=ngエージェントNがクロールしました] – ca9163d9