Vaibhav
그는 물었다 12년 전
3

Best Practice 다중스레딩 설계

이 문제를 고려해보십시오. I have a 프로그램 페치할 하는 데이터베이스에서 레코드 (let& # 39 의 말하도다) 100 에서 정보를 웹 서비스, 그리고 각 선택기에 업데이트됩니까 합니다. 이 시나리오에서의 소개하십시오 병렬 처리 방법은 두 가지입니다.

  1. I start 요청할 때마다 웹 서비스에 대한 신규 어떨까. 이 동시에 여러 스래드입니다 일부 외부 매개변수입니다 제어됩니다 (또는 동적으로 조절할 짐작이지만요.).

  2. 내가 만든 작은 배치 (let& # 39 의 말하도다 각 10 레코드전자문서의) 출시, 각 일괄작업 별개의 스레드할 (그러하매 응해 acrobatconnectcentral. 10 스래드입니다).

이는 더 나은 외곽진입, 왜 그렇게 생각하세요?

Stu
그는 12년 전 댓글을 달았습니다
0

이후 여러 dynamic/configurable 최적의 환경과 병목 현상이 실제로 어떤 달려 있다.

Patrick
그는 12년 전 댓글을 달았습니다
0

이 말은 대한 작업을 [트레더풀] (http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx). 바로 서고, 닷넷 (.net) 기반의 작업을 처리할 미삭.

Vaibhav
그는 12년 전 댓글을 달았습니다
0

글쎄, 난 이 측면에서 제어을 무중단으로 트레더풀 @patrick 생각을 했다. 하지만 그건 내가 알아내려 하고 있는지 성능을 둘 사이의 다른 방식 (트레더풀, 실제로 모두에서 사용할 수 있습니다). 만일 한 것은 성능, 유지됩니까 best practice 따라야 합니다.

답변 4 개

옵션 3 은 베스트중에:

비동기 입출력 (i / o 사용합니다.

처리가 복잡하고 무거운 요청이 없는 한 프로그램에 99% s 기다리는 시간을 보낼 예정이며 이 it& # 39, HTTP 요청.

이것이 정확히 어떤 비동기 입출력 (i / o 자 indows 네트워킹으로의 고안되었습니다 스택할 (또는 .net framework 무엇이든 간에) 에 대한 걱정은 단일 스레드를 사용하여 모든 기다림커서, 그리고 그냥 # 39, & # 39 와 발송하십시오 up& 강조표시할. 이 결과를 얻을 수 있습니다.

Net framework 죄송합니다. 엉덩이를 오른쪽맞춤 고통을 알 수 있을 것입니다. # 39 기초형상 소켓을 사용하는 경우, re 그냥 # 39 의 간소화하는지 it& you& 또는 Win32 api. # 39 의 here& ᄀ군 (테스트됨!) 어쨌든 사용 예를 C # 3:

using System.Net; // need this somewhere

// need to declare an class so we can cast our state object back out
class RequestState {
    public WebRequest Request { get; set; }
}

static void Main( string[] args ) {
    // stupid cast neccessary to create the request
    HttpWebRequest request = WebRequest.Create( "http://www.stackoverflow.com" ) as HttpWebRequest;

    request.BeginGetResponse(
        /* callback to be invoked when finished */
        (asyncResult) => { 
            // fetch the request object out of the AsyncState
            var state = (RequestState)asyncResult.AsyncState; 
            var webResponse = state.Request.EndGetResponse( asyncResult ) as HttpWebResponse;

            // there we go;
            Debug.Assert( webResponse.StatusCode == HttpStatusCode.OK ); 

            Console.WriteLine( "Got Response from server:" + webResponse.Server );
        },
        /* pass the request through to our callback */
        new RequestState { Request = request }  
    );

    // blah
    Console.WriteLine( "Waiting for response. Press a key to quit" );
    Console.ReadKey();
}

편집:

39, & # 39 는 .NET 의 경우, callback& 완료. 실제로 해고 얻을 수 있는 것은, 주 업무는 계속 할 수 있도록 스레드할 트레더풀 스레드할 모두 잠급니다 공유 리소스를 관리하는 모든 문제가 있지만 여전히 절약해줍니다 스래드입니다.

C1pher
zvikara
그는 12년 전 댓글을 달았습니다
1

정말 전달해야 하는 요구가 을 사용할 수 있는 상태로 사용하여 요청을 객체인지 또는 폐쇄 바인딩될 가변으로?

두 가지 사항을 고려해야 합니다.

1. 레코드 처리하는 데 얼마나 걸립니까?

이 경우, 매우 빠른 처리가 기록하십시오 오버헤드에 기록을 넘겨 오프하도록 스래드입니다 병목 현상이 될 수 있습니다. 이 경우, 할 수 있도록 # 39 그녀의심장을 번들하기 레코드전자문서의 don& 끄기도구 너무나 자주 주면 된다.

이에 대해 합리적으로 기록하십시오 처리가 될 경우, 그 차이는 무시할 간단해진다는 외곽진입 (1 당 기록하십시오 스레드할) 는 아마 최고라니까요

2. 가부키쇼 스래드입니다 시작할 계획이 있습니까?

39 를 사용하는 경우, 트레더풀, aren& 인컨텍스트 수동으로로 수를 제한할 필요가 없는 것 같군요, 또는 분할하려면 로 데이터를 대량량 청크를 스래드입니다 합니다. 새로운 시작 스레드할 시스템에 대한 모든 기록을 남깁니다 경우 확보하십시오 대승을 레코드 수가 많은 관심을 끌고 있다.

Vaibhav
그는 12년 전 댓글을 달았습니다
0

네, 그 고려사항입니다 유용하게 사용할 수 있습니다. 이것은 이후 전화를 걸어 퍼블릭 도메인 webservice 여부를 확인하기 위해 몇 가지 테스트를 할 것, 그래서 우리는 실행하십시오 오버헤드에 작업 자체가 (의심스러운데) 를 넘는다. 사용 및 그러하너라 트레더풀 은 생각하신거야 말해둘꼐요 방안도 검토한 것 "이라고 말했다.

내려받습니다 [평행광 Fx] [1]. 브록링콜레스티온 봐. 일괄 처리 기록, 1 부터 n 이 스레드할 사용하여 채우기할 스래드입니다 레코드는유지합니다 수집품을 볼 수 있는 서비스. 속도를 제어할 수 있는 웹 서비스에 대한 호출하십시오 스래드입니다 컬렉션은 급지됨, 이 수는 있다. 이 작업을 통해 구성할 수 있도록 콘피그체션 의해 수집 및 you& # 39 명, 일반 저회가 공급하는, ll have a nice 리틀이에요 바처 데이터베이스에구성원을 heart& # 39 의 내용을 다시 사용할 수 있습니다.

[1]: http://www.microsoft.com/downloads/details.aspx = e848dc1d-5be3-4941-8705-024bc7f180ba 파밀리이드?

병목 현상이, 컴퓨터 프로그램을 실행하는 것이 아닐 수 있습니다. 즉, HTTP 프로토콜을 는 소켓 연결을 살려둘 헤더입니다 보낼 수 있는 여러 가져오기 요청에만 같은 컨트롤러상의 있는 TCP / IP 에서 절약해줍니다 손 떨림. # 39 에서 사용하는 방법을 모르는 내가 don& 죄송합니다., 닷넷 (.net) 기반 라이브러리. (수 있어야 한다.)

이 요청을 받아 지연 될 수도 있을 것입니다. 할 수 있다는 것을 확실히 하는 너회가 따지지 투명지에 횟수의 미수행 요청을 합니다.