2011-07-02 3 views
3

http://fssnip.net/3K 코드를 사용하여 콘솔 프로그램을 만들었습니다. 스레드의 마무리를 기다릴 끝에 | 그리고F # MailboxProcessor questions

  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이 표시됩니다. 모든 크롤러가 처형을 완료했는지 감지하는 방법입니까? 내가 마지막에()를 Console.Readline을 추가하지 않으면

[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 "크롤링 [홈페이지]"이 실행되지 않습니다, 그러나
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

난 당신에 대한 질문 두 가지 기능을 이전 확장하는 조각 만든 : http://fssnip.net/65합니다.

  1. 는이 문제를 해결하기 위해, 나는 AsyncReplyChannel<unit>을 수행 Start 메시지를 추가했습니다. 수퍼바이저 에이전트가 시작되면이 메시지를 기다리고 나중에 사용할 수 있도록 응답 채널을 저장합니다. 완료되면이 채널을 사용하여 응답을 보냅니다.

    에이전트를 시작하는 함수는 응답을 기다리는 비동기 워크 플로를 반환합니다. 그런 다음 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&hl=ko 에이전트 4가 크롤링했습니다. 에이전트 4가 완료되었습니다. http://groups.google.com/grphp?hl=ko&tab=ng 상담원이 크롤링했습니다. 상담원 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=ko&tab=ng 에이전트 N에서 크롤링했습니다.] – ca9163d9