sourcecode

Spring ThreadPool 작업에서 corePoolSize와 maxPoolSize의 차이점은 무엇입니까?실행자

copyscript 2023. 8. 27. 09:47
반응형

Spring ThreadPool 작업에서 corePoolSize와 maxPoolSize의 차이점은 무엇입니까?실행자

저는 웹사이트의 모든 사용자들에게 대량의 이메일을 보내야 합니다.보내는 이메일마다 쓰레드 풀을 사용하고 싶습니다.현재 값을 다음으로 설정했습니다.

<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />

둘 사이의 차이점은 무엇이며 확장될 것입니까?현재 약 1만 명의 사용자가 있습니다.

다음은 스레드 생성을 위한 Sun의 규칙입니다.

  1. 가 스드수다작경은우다음보보다 corePoolSize새 작업을 실행할 새 스레드를 만듭니다.
  2. 그 일 , " " " " " " " " ( " " " " " " " " " "corePoolSize작업을 대기열에 넣습니다.
  3. 때 스레드 가 "" " " " " " 적을 maxPoolSize태스크를 실행할 새 스레드를 만듭니다.
  4. 때 가 "" " " " " " " 일 maxPoolSize그 일을 거절합니다.

전문

원산지 답변

자바독이 가장말해줍니다.

보다 적은 [...]]보다 작은 경우corePoolSize스레드가 실행 중이고 다른 작업자 스레드가 유휴 상태인 경우에도 요청을 처리하기 위한 새 스레드가 생성됩니다.다음 이상이 있는 경우corePoolSize보다 maximumPoolSize스레드가 실행 중입니다. 대기열이 꽉 찬 경우에만 새 스레드가 생성됩니다.corePoolSize그리고.maximumPoolSize마찬가지로 고정 크기의 스레드 풀을 생성합니다.maximumPoolSize 로같가로다, 과이치음한한과 같이 가 없는 으로.Integer.MAX_VALUE풀이 임의의 수의 동시 작업을 수용하도록 허용합니다.

당신의 구체적인 상황에 대해 말하자면, 500개의 이메일을 동시에 보내는 것은 무의미하며, 당신은 메일 서버를 압도할 것입니다.많은 수의 전자 메일을 보내야 하는 경우 단일 스레드를 사용하여 한 번에 하나씩 파이프로 보냅니다.메일 서버는 500개의 개별 연결보다 훨씬 더 우아하게 이 작업을 처리합니다.

corePoolSize풀에서 사용하는 최소 스레드 수입니다. 최로증할대습니까지 증가할 수 있습니다.maxPoolSize 부가감면풀다축시소다니됩이하소하▁back▁will다▁to로 줄어들 입니다.corePoolSize.

전자 메일 전송이 I/O 바인딩 작업인 것 같습니다.저는 500개의 실이 있다고 해서 더 빨라질 것이라고 생각하지 않습니다.

우리는 이미 너무 많은 답을 가지고 있고 충분할 것이지만, 저는 항상 이틀에 한 번씩 헷갈렸습니다.그래서 저는 이것과 관련된 실시간 예시를 생각해냈습니다!

이것을 얻는 간단하고 효율적인 방법은 자신이 은행에 있다고 생각하는 것입니다.

당신은 이용 가능한 창문이 있는데도 줄을 서 본 적이 있습니까?이용 가능한 현금 창구가 있다면 은행은 왜 고객을 대기열에 유지해야 합니까?그것이 바로 그렇습니다.core pool size사용되지 않는 스레드가 있는 경우 새 태스크가 해당 스레드에 직접 할당됩니다.

enter image description here

사용 가능한 창(코어 풀 크기)이 가득 차면 고객은 대기열에서 기다리라는 요청을 받습니다.여기가 바로 그 곳입니다.queue-capacity사진으로 나옵니다!더 이상 작업을 대기열에 넣을 수 없을 때까지 새 작업이 대기열에 있습니다.

enter image description here

대기실이 손님들로 가득 차면 어떻게 합니까?은행은 고객 수(업무)가 급증함에 따라 새로운 현금 창구를 할당/개방할 수 있습니다.그들은 예비군 3명이 더 있었습니다., 그가옵니다자옵니▁the다▁comes▁here,자가가 나옵니다.max pool size문맥상

이러한 창(스레드)이 모두 사용되면 은행은 더 이상 새 고객(작업)을 서버로 사용할 수 없습니다.동의하십니까?그리고 그 이후로, 새로운 작업은 허용되지 않습니다!

enter image description here

@skaffman이 공식 문서에서 지적한 것 외에도 다음은 이러한 크기가 어떻게 활용되는지를 더욱 명확하게 합니다.

조금도BlockingQueue제출된 작업을 전송하고 보류하는 데 사용할 수 있습니다.은 풀 조정과 작용합니다.

  • 다음보다 적은 경우corePoolSize.Executor항상 대기열보다 새 스레드 추가를 선호합니다.
  • 한다면corePoolSize이거나 더 가 실행 중입니다.Executor항상 새 스레드를 추가하는 대신 요청 대기열을 사용합니다.
  • 에 넣을 수 , 이 요을대에넣을수없초경다않을 초과하지 않는 한 새 됩니다.maximumPoolSize이 경우 작업이 거부됩니다.

corePoolSize 또는 maxPoolSize 값을 증가시키는 것보다 queueCapacity 값을 증가시키는 것을 고려해야 합니다.이러한 두 속성(*PoolSize)은 실행할 풀의 수이지만 각 메시지는 queueCapacity에서 고려됩니다.

<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="10" />
<property name="queueCapacity" value="1000" />
<property name="waitForTasksToCompleteOnShutdown" value="true"/>

1000 * 10 (maxPoolSize) = 10000을 전송할 사용자가 10000이지만 각 스레드에 대해 1000이 무거울 경우 poolSize를 늘리는 것을 고려할 수 있습니다.

모든 사람들이 그렇게 명확하게 설명한 것은 맞습니다.여기서 주목해야 할 몇 가지 사항은 대기열뿐만 아니라 코어 풀의 크기도 항상 제한적이어야 한다는 것입니다.core-pool-size가 매우 높을 경우 요청할 때마다 max-pool-size에 도달할 때까지 새 스레드가 생성되므로 풀의 많은 스레드가 특정 기간 동안 사용되지 않은 상태로 남아 있을 가능성이 높습니다.

그러나 시스템이 동시에 많은 수의 요청에 직면할 경우 시스템 크기가 충분하다는 점도 고려해야 합니다. 예:

시스템 크기(1GB)와 대기열 용량이 정수인 경우.MAX_VALUE를 선택하면 JVM GUI 도구에서 모니터링할 수 있는 Out Of Memory로 인해 시스템이 요청을 거부하기 시작할 가능성이 높습니다.

언급URL : https://stackoverflow.com/questions/1878806/what-is-the-difference-between-corepoolsize-and-maxpoolsize-in-the-spring-thread

반응형