2011-09-05 2 views
0

50K Runnables가 30 분마다 무기한 실행되도록 예약한다고 가정합니다. 각 Runnable은 1-5 초가 걸리고 하나의 Socket 조작을 수행합니다. TheadPool의 크기는 200입니다.효율적인 프로세서 사용으로 예약 된 작업 배포

지금 scheduleWithFixedDelay 호출로 각 50K Runnables의 초기 호출 지연을 결정하는 방법 (또는)이 Runnable을 프로세서 효율적인 방법으로 예약하는 방법.

이러한 종류의 예약을 배포하기위한 표준 알고리즘이 있습니까?

감사합니다.

+0

Executor에서'Runnable' 인스턴스를 던지서 가능한 빨리 처리하도록하십시오. 초기 지연의 목적은 무엇입니까? NB : 많은 I/O 바운드 (?) 연산에 대해 비동기 실행 체계를 사용하는 것이 더 나을 것입니다. – Waldheinz

+0

나는 정말 궁금해서 왜 50,000 개의 Runnables가 필요하겠습니까! – medopal

+0

"효율적인 프로세서 방식"이란 무엇을 의미합니까? 내가 아는 한, 당신은 수동으로 지연을 계산할 필요가 없습니다. 당신은 하나의 스레드가있는 하나의 ScheduledExecutor를 만들고, 두번째는 200 개의 스레드가있는 Executor를 만듭니다. 첫 번째 ScheduledExecutor는 하나의 작업 만 실행합니다. "30 분마다 두 번째 Executor 대기열에 50K Runnables가 저장됩니다." 이것은 당신에게 해결책을 줄 것이다. – BegemoT

답변

2

각기 최대 5 초가 걸리는 50K Runnables가 있으면 작업 시간은 250,000 초입니다. 이 작업을 30 * 60 초마다 실행하려면 최소 139 개의 스레드에서이 작업을 실행해야합니다. 200 개의 스레드를 사용하면 모두 실행하는 데 20 분이 걸릴 수 있습니다. 이러한 작업을 5 분 내에 완료하려면 더 많은 스레드가 필요할 수 있습니다.

간단한 읽기 또는 쓰기에는 1-5 초가 걸리지 않습니다. 하나의 소켓 작업은 읽기 또는 쓰기를 의미합니까, 아니면 소켓을 열고 데이터를 보내고 응답을 받는다는 것을 의미합니까? 나중에는 많은 오버 헤드가 발생할 수 있습니다.

50K는 많이 있지만 30 분 간격으로 가능한 한 가깝게 작업을 실행해야하는 경우가 아니라면이 많은 예약 된 작업이 있습니다. 50K 독립 작업이있는 경우 약 30 분마다 실행되지만 서로 다른 시간에 실행됩니다. 50K 코어가 없으므로 어느 정도는 피할 수없는 일이지만 가능한 한 가까운 곳에서 실행하는 것이 얼마나 중요할까요?

+0

소켓 읽기 및 쓰기. 작업이 실행되는 간격은 매우 중요하며 소켓 작업과 관련된 오류가 발생하면 다른 개체를 호출해야합니다. – itsraja

+0

내가 말한 것처럼 모든 것을 실행하는 데 최대 20 분이 걸릴 것입니다. 이 경우 어떻게됩니까? –

+0

물건이 소켓 작동없이 잘 작동합니다. 그러나 소켓을 사용할 때로드가 급격히 증가합니다 (Linux). – itsraja

0

시간 제한에 따라 일정을 배포하는 것이 좋습니다.

30 분이면 모든 50000 개의 작업을 예약하고 완료하는 데 1800 초가 걸립니다.

마지막 작업 라운드를 완료하는 데 소요되는 시간을 계산하면 50000/(1800-5)입니다.

이것은 약 28 (반올림) 작업을 1 초에 완료하는 것과 같습니다. 따라서 간단한 접근법은 최소한 초당 28 개의 작업을 예약하는 것입니다. 이는 지정된 시간 내에 모든 작업을 완료하는 동안 자원의 동시 소비를 최소화합니다. 최대 5 초의 작업이 완료되면 최대 동시 소켓 작업 수가 140이 될 것이므로 소켓 작업의 스레드 풀 크기는 걱정할 필요가 없습니다.

schedule은 0에서 1794까지의 루프를위한 것입니다.이 경우에는 28 개의 작업으로 구성된 지연 시간을 스케줄링합니다. 다시 시작하기 전에 30 분 표시까지 반올림하는 지연이 이어집니다.