2013-10-12 1 views
2

나는 C#에서 무거운 웹 스크래퍼를 쓰고있다. 나는 그것이 빠르고 신뢰할 수 있기를 바랍니다. Parallel.Foreach 및 Parallel.For가 너무 느립니다. 입력의 경우 URL 목록을 사용하고 있습니다. 정확히 같은 시간에 작업하는 스레드를 최대 300 개 갖고 싶습니다 (내 CPU 및 네트워크 연결이이를 처리 할 수 ​​있음). 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 이 작업을 사용하면 더 잘 작동합니까? 때로는 스레드가 명백한 이유없이 끝나고 일부 결과가 저장되지 않는 경우가 있습니다. 나는 이것을 더 믿을만한 방법으로 원한다. 어떤 아이디어? 더 단단한 큐 유형의 스크래핑을 원합니다. 내가 (모든 코드가 있지만, 중요한 부분)를 내놓았다 무엇 :C에서 병렬화에 대한 몇 가지 질문 #

 List <string> input = // read text file 
     int total = words.Length; 
     int maxThreads = 300; 

     while (true) 
     { 
      if (activeThreads < maxThreads) 
      { 
       current++; 
       Thread thread = new Thread(() => CrawlWebsite(words[current])); 
       thread.Start(); 
      } 
     } 

     public static void CrawlWebsite(string word) 
     { 
      activeThreads++; 

      // scraping part 

      activeThreads--; 
     } 
+5

activeThreads가 보호되지 않아서 경주 할 것입니다. 정황. –

+3

두 개의 '병렬'방법이 너무 느리다는 것을 어떻게 결정 했습니까? –

+0

@ John Saunders 필자는 내 자신의 예제와 Parallel을 시도했다. 결과를 비교했다. Parallel.Foreach는 MaxDegreeOfParallelism을 더 높은 숫자로 설정하는 경우에도 2 개의 스레드 만 실행합니다. – bbrez1

답변

1

System.Threading.ThreadPool을 사용하는 것이 좋습니다. ActiveThread를 관리 할 필요가 없을뿐만 아니라 많은 스레드가있는 시나리오에서 조금 더 빠를 수 있습니다. 대신 ThreadPool.SetMaxThreads() 및 SetMinThreads()를 사용할 수 있으며 ThreadPool은 병렬 스레드 수를 관리합니다.

현재 귀하의 예제에서 공유 변수가 동기화되지 않습니다. 액세스를 동기화하는 방법 중 하나는 "잠금"을 사용하는 것입니다. http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

스레드 실행 메소드 - CrawlWebsite()는 ThreadAbortException을 처리해야합니다. http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx을 참조하십시오.

+0

굉장. 감사 – bbrez1

1

나는 최근에 매우 비슷한 문제를 다루고 있으며 많은 수의 스레드를 사용하면 속도가 빨라질 것이라고 생각하지 않습니다. 가장 느린 생각은 일반적으로 데이터를 다운로드하는 것입니다. 그들이 네트워크 연결 데이터 전송 등을 기다리고 있기 때문에 많은 수의 쓰래드를 사용하는 것이 더 빠르지 않습니다. 그래서 두 개의 대기열을 가지게되었습니다. 하나는 비동기 다운로드 요청 (한 번에 10-15 개의 요청)을 보내는 작은 수의 스레드에 의해 처리됩니다. 응답은 다른 큐에 저장되어 파싱 및 데이터 처리를 담당하는 다른 스레드 풀로 이동합니다 (여기서 스레드 수는 CPU 및 처리 알고리즘에 따라 다릅니다).

나는 또한 다운로드 한 모든 데이터를 데이터베이스에 저장합니다. 웹에서 새로운 정보를 구문 분석 할 때마다 콘텐츠를 다시 다운로드 할 필요가 없지만 DB에서 캐시 된 웹을 구문 분석해야합니다 (시간 절약)