문제

나는 일을 하려고 밖으로 내 머리에서 최선의 방법은 구조화하는 코코아의 본질적으로 동시에 다운로드 매니저입니다.가 서버 응용 프로그램 회담,사용자에게 목록을 아래로 당겨,그리고 응용하는 프로세스 목록입니다.(이것은 사용하지 않는 HTTP,할 수 있도록 사용하여 URL 을 로딩 시스템기에 걸쳐 소켓 연결이 있습니다.)

이것은 기본적으로 클래식 생산자-소비자 패턴이다.트릭은 소비자의 수는 고정,그리고 그들이 지속됩니다.서버 설정에 엄격한 제한이 동시 연결하는 열 수 있습니다(하지만 일반적으로 두 개 이상),그리고 새로운 연결을 비싸다,그래서에 이상적인 세계 동 N 연결하는 열의 일생을 위한 응용이다.

이 접근 방법 중 하나 될 수 있을 만드는 N 스레드는 각각의 것이라"자신의"연결을 기다리에서 요청을 큐에 차단하는 경우 그것은 비어 있습니다.의 수 있기 때문에 연결이 되지 않는 거대한,이 불합리한 관점에서의 실제 시스템에 오버헤드가 발생합니다.하지만 개념적으로,그것은 같은 것 코코아를 제공해야 합한 솔루션입니다.

그것처럼 보인다 사용할 수 있는 NSOperationQueue, 고,전화 setMaxConcurrentOperationCount: 숫자와의 연결이 있습니다.그때 나는 그냥을 던져 다운로드 요청으로 하는 큐가 있습니다.하지만,이 경우,어떻게 연결을 관리하기 위해 자체.(다만에 넣어 스택에 의존하는 큐를 지키지 위/아래-실행하는가?에 던져 파견 세마포 과 함께 스?)

이제는 우리의 용감한 새로운 세계 그랜드 센트럴 파견, 가 열리는 다른 방법으로 달려들의 이?첫째로,그것같이 보이지 않는,그 이후 GCD 의 주력하는 능력을 동적으로 규모를 동시성(에서 언급된 애플의에 대한 권장 사항 변화하는 생산자-소비자 구현)지 않는 실제로 저를 돕는다.하지만 난 그냥의 표면을 긁어에 대해 읽고 있습니다.

편집:

는 경우 그것은 중요하다:그렇다,나는 계획에 사용하는 비동기/금 차단 소켓 Api 않는 실제 서버와의 통신.그래서 I/O 자체하지 않아서 그것의 자신의 스레드(s).나는 단지와 관련 역학의 대기업,그리고(안)준하는 연결,사용자 정의할 수 있습니다.

도움이 되었습니까?

해결책 2

에 대한 후손들을 위하여,논의 후,다른 곳에서 솔루션 난 채택을 위해 이 기본적으로:

  • 큐의 보류 중인 다운로드 작업,처음에는 비어 있습니다.
  • 정을 포함하는 모든 열린 연결에,처음에는 비어 있습니다.
  • 가 변경 가능한 배열(큐,정말)의 유휴 열려있는 연결을,처음에는 비어 있습니다.
  • 사용자가 추가로 다운로드 요청은:
    • 는 경우의 배열 상태를 유지하는 연결하지 않거나 할당 다운로드 할 수 있습니다.
    • 이 없는 경우에는 유휴 상태 연결지만,전체 연결에 도달하지 않은 한계를 열고 새로운 연결을 추가 설정 및 할당한 다운로드 할 수 있습니다.
    • 그렇지 않으면 인큐 다운로드합니다.
  • 면 다운로드가 완료되:가 있다면 대기 중인 요청,큐에서 하나 고 그것을 연결;그렇지 않으면,연결을 추가 유휴 목록입니다.

의 모든 작동하는 것을 주요 thread.의 작품을 디코딩하는 결과가 서로 다운로드 할 것로 GCD,그래서 그것은 처리할 수 있는 제한 동시성,그리고 그것을 막지 않는 메인 스레드가 있습니다.

새로운 연결을 시간이 걸릴 수 있습니다,그래서 프로세스의 새로 만들 수 있습니다 조금 더 복잡한 실제 연습에서(예를 들어,삽입,다운로드를 시작한 연결 프로세스,그리고 다음에서 그것은 때 연결이 완전히 설치되는).하지만 나는 아직도 내 생각의 인식의 가능성이 경쟁 조건을 과장.

다른 팁

를 사용하는 경우 CFSocket 의 비 통화를 차단 I/O,I agree,해야 하는 모든 일에서 주요 실시키고,OS 처리하는 동시성 문제 때문에,당신은 데이터를 복사하고 정말 모든 계산이 수행됩니다.

을 넘어,그것은 같은 소리만 다른 작업의 응용을 필요로 하는 큐를 유지 품목의 다운로드 할 수 있습니다.어떤 때는 하나의 전송이 완료되면 CFSocket 호출을 다시 시작할 수 있는의 전송에는 다음 항목에서 큐가 있습니다.(큐가 비어 있을 경우,감소의 연결을 계산하고,뭔가가 빈 큐,시작하는 새로운 전송합니다.) 나는 보지 않는 왜 필요한 여러 스레드니다.

어쩌면 당신은 왼쪽으로는 뭔가 중요하지만,당신의 설명에 근거 응용 I/O 지 않 CPU,그래서 모든 동시성 재료를 만들려고 더 복잡한 코드에 대한 영향을 최소화하면 성능이다.

모든 주요 thread.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top