2008-09-14 2 views
8

응용 프로그램을 어떻게 멀티 스레드로 만드나요? 비동기 기능을 사용합니까? 또는 새 스레드를 생성합니까? 나는 asynch 함수가 이미 쓰레드를 생성하고 있다고 생각한다. 그래서 만약 당신의 일이 게이가되고 단지 스레드에서 당신의 일을 산란하는 것은 단지 파일을 읽는 것일 뿐이므로 ressources를 "낭비 할"것이다. 그래서 어떤 종류의 디자인이있다. 스레드 또는 비동기 함수 사용?스레드 또는 asynch?

답변

6

산란 스레드는 산란을 시작하면 리소스를 낭비 할뿐입니다. 하나 또는 두 개의 추가 스레드가 플랫폼 예측에 영향을 미치지 않으며, 현재 infact 시스템에 현재 70 개가 넘는 스레드가 있으며, MSN은 32 개를 사용하고 있습니다. (나는 메신저가 그 많은 스레드를 사용할 수있는 방법을 모르는 채로, 외형은 최소화하고 실제로 아무것도하지 않을 때 ...)

스레드를 생성하는 데는 시간이 많이 걸리지 만, 다른 일을 계속해야합니다.

예를 들어 계산에는 30 초가 걸립니다. 가장 좋은 방법은 계산을 위해 새 스레드를 생성하는 것입니다. 그러면 화면을 계속 업데이트하고 사용자 입력을 처리 할 수 ​​있습니다. 사용자가 계산을 마칠 때까지 앱이 정지되면 사용자가 그것을 싫어할 수 있기 때문입니다.

반면에 거의 즉시 수행 할 수있는 작업을 수행하기위한 스레드를 만드는 것은 거의 무의미하다. 스레드 풀을 사용하여 기존 스레드에 작업을 전달하는 것보다 오버 헤드가 높을 것이기 때문이다. 처음에는 직업.

때로는 자신의 스레드에서 실행되는 몇 가지 별도의 부품으로 응용 프로그램을 깰 수 있습니다. 예를 들어 게임에서 업데이트/물리학 등은 하나의 스레드 일 수 있고 grahpics는 또 하나, 사운드/음악은 세 번째, 네트워킹은 또 다른 스레드 일 수 있습니다. 여기에있는 문제는이 부분들이 어떻게 상호 작용하는지에 대해 생각해야한다는 것입니다. 그렇지 않으면 외관상으로는 "무작위 적으로"발생하는 버그, 또는 심지어 교착 상태에 빠질 수도 있습니다.

7

.Net에 대해 이야기하는 경우 ThreadPool을 잊지 마세요. 쓰레드 풀은 asynch 함수가 종종 사용하는 것입니다. 스레드를 많이 생성하면 실제로 성능이 저하 될 수 있습니다. 스레드 풀은 작업을 가장 빠르게 수행 할 수있는 충분한 스레드를 생성하도록 설계되었습니다. 따라서 스레드 풀이 사용자의 요구를 충족시키지 않으면 자신의 스레드를 spwan하는 대신 스레드 풀을 사용하십시오.

PS : 그리고 스레드의 사용은 당신이 방법을 응용 프로그램이 스레딩이 필요하고 장기적으로 당신의 성능을 제어/쉽게 개선 할 수 있습니다에 대한 자세한 내용을 생각하게 마이크로 소프트

에서 Parallel Extensions
0

을 눈을 밖으로 유지 .
비동기 메서드는 사용하기가 더 빠르지 만 약간 마술입니다. 가능한 많은 일들이 가능하기 때문에 어느 시점에서 당신에게 줄 수없는 무언가가 필요할 것입니다. 그런 다음 사용자 정의 스레딩 코드를 시도하고 굴릴 수 있습니다.
모두 귀하의 필요에 따라 다릅니다.

2

거 야 두 번째 Fire Lancer's 대답 - 당신의 자신의 스레드를 생성하는 큰 작업을 처리하거나 당신이 있어야 동기 응용 프로그램의 나머지 부분, 에 "차단"하지만 것입니다 작업을 처리 할 수있는 훌륭한 방법입니다 스레드의 작업을 명확하게 정의하고 그것이하는 일의 범위를 제한하는 방식으로 해결해야하는 문제에 대한 명확한 이해.

내가 최근에 작업 한 예를 들면, Java 콘솔 앱이 본질적으로 URL을 화면 스크랩하고, DOM으로 문서를 파싱하고, 데이터를 추출하고 데이터베이스에 저장함으로써 주기적으로 실행합니다.

단일 스레드 응용 프로그램으로, 예상대로, 50kb 페이지에서 약 1 초의 평균 URL을 사용합니다. 너무 나쁘지는 않지만 일괄 적으로 수천 개의 URL을 처리해야 할 필요가 생길 때 유용하지 않습니다.

응용 프로그램을 프로파일 링하면 활성 스레드가 유휴 상태 였음을 알 수 있습니다. I/O 작업을 기다리고있었습니다. 원격 URL에 대한 소켓 열기, 데이터베이스 연결 열기 등이 그 예입니다 멀티 스레딩으로 쉽게 향상시킬 수 있습니다. 멀티 쓰레드로 재 작성되고 하나의 코어 CPU 에서조차도 5 개의 쓰레드 만 사용하는 대신 20 개의 쓰루풋이 향상되었습니다.

이 예제에서 각 "작업자"스레드는 명시 적으로 수행 한 작업으로 제한됩니다. 원격 URL을 열고 원격 URL을 열고 데이터를 구문 분석 한 다음 db에 저장합니다. 모든 "상위 레벨"처리 - 구문 분석 할 URL 목록 생성, 다음 작업, 오류 처리, 모두 주 스레드의 제어와 함께 유지됩니다.

0

대답은 "다릅니다"입니다.

달성하려는 목표에 따라 다릅니다. 더 많은 공연을 목표로하고 있다고 가정 할 것입니다.

가장 간단한 해결책은 실적을 향상시킬 수있는 다른 방법을 찾는 것입니다. 프로파일 러를 실행하십시오. 핫스팟을 찾으십시오. 불필요한 IO를 줄입니다.

다음 해결책은 프로그램을 여러 프로세스로 나누는 것입니다. 각 프로세스는 고유 한 주소 공간에서 실행될 수 있습니다. 이것은 개별 프로세스가 서로 엉망이 될 가능성이 없기 때문에 가장 쉽습니다.

다음 해결책은 스레드를 사용하는 것입니다. 이 시점에서 웜의 주요 깡통을 열었으므로 작게 시작하고 코드의 핵심 경로 만 멀티 스레드하십시오.

다음 해결책은 asynch IO를 사용하는 것입니다. 일반적으로 매우 부하가 심한 서버를 작성하는 사람들에게만 권장되며, 그렇다고하더라도 세부 사항을 추상화하는 기존 프레임 워크 중 하나를 다시 사용합니다. C++ 프레임 워크 ICE 또는 Java의 EJB 서버.

각각의 솔루션에는 여러 가지 하위 솔루션이 있습니다. 서로 다른 종류의 스레드와 서로 다른 종류의 비동기 IO가 있습니다. 각각 성능 특성이 약간 다르지만 일반적으로 프레임 워크에서 처리하도록하는 것이 가장 좋습니다 .

관련 문제