2012-05-24 3 views
1

나는 간단한 웹 거미를 만들고 있습니다. URL을 수락하고 HTML을 다운로드 한 다음 나머지 URL을 추출하는 것뿐입니다. 그런 다음 각 새 URL에 대해 프로세스를 반복합니다. 또한 동일한 URL을 두 번 방문하지 않으며 동시 다운로드 수를 제한하고 있습니다.스레드 트리 완료시 감지

모든 고유 URL을 모두 사용한 후에 (며칠, 몇 주 또는 내가 죽은 후에 사라질 때까지) UI 업데이트 또는 단순히 응용 프로그램 종료와 같은 작업을 수행하고 싶습니다.

문제는 마지막 스레드가 실행을 완료했을 때를 감지하는 방법을 모른다는 것입니다.

이 스레딩 문제가 해결 되었습니까? 나는 그 문제를 잘못보고 있니?

한 가지 생각은 모든 자식이 완료 (가입) 할 때까지 각 스레드를 활성 상태로 유지하는 것입니다. 문제는 스레드 수가 기하 급수적으로 증가한다는 것입니다. 이러한 장기 실행 프로세스의 경우 OS 리소스를 빠르게 소모합니다.

답변

2

나는 우리가 어떤 언어로 이야기하는지 잘 모르겠다. 그래서 나는 일반적으로 말할 것이다.

생성되는 "하위"페이지 수를 추적하는 각 URL에 대한 데이터 구조가 필요합니다. URL이 spidered 될 때마다 "상위"데이터 구조를 갖습니다. 새 페이지가 발견 될 때마다 부모의 트리 수에 추가됩니다. 페이지가 spidered되면 부모의 트리 수가 감소합니다. 여러 스레드가이를 업데이트 할 것이므로 동기화 된 방식으로 수행해야합니다.

실제로 전체 URL 구조를 저장할 수 있습니다. 루트 URL "http : //foo.x/"에는 "/1.html"및 "/2.html"에 대한 링크가 있으므로 어린이 수는 2입니다. 루트 URL은 null 부모를 가지며 "1"및 " 2 "는 루트의 부모를가집니다. "1.html"이 spidered되면 root의 children-count는 1로 감소합니다. 그러나 "1.html"안에 3 개의 링크가 있으면 root의 수는 4로 증가합니다. 트리를 추적하려는 경우 그 다음 "1.html"자식 수는 3 등이됩니다. "1.html"자식 중 하나가 spidered되면 "1.html"수는 2로되고 루트 URL 수는 3이됩니다.

당신은 분명히 이 아니며,은 스레드를 유지하고 나중에 합류하고 싶습니다. 스레드 수가 폭발적으로 증가 할 것입니다. 스레드 풀을 사용하고 URL 트리에 연결된 노드가있는 각각의 spidered URL을 풀에 제출하여 동일한 스레드에서 spidered 할 수 있도록해야합니다.

URL이 spidered되고 자식 수가 0이되면 전체 트리를 spidered했으며 URL을 작업 목록에서 삭제하고 완료 목록으로 이동할 수 있음을 알았습니다. 다시 말하지만,이 목록은 여러 스레드가 작동하기 때문에 동기화되어야합니다.

희망이 다소 도움이됩니다.

+0

나는 다른 사람에게서 비슷한 대답을 얻었다. 자식 스레드를 시작하기 전에 단순히 증가시키고 이후에 감소시킵니다. 카운트가 0이되면, 그 자식 스레드는 "끝났습니다"작업을 시작하게하십시오. 감사! –