Ruby Limit to number of thread in loop(반복문에서 제한된 갯수의 쓰레드 돌리기)

보통 쓰레드는 개별단위의 처리 수행이나 고 성능의 작업(요청을 엄청나게 전송한다는 둥, 빠른 계산이 필요한다는 둥)이 필요할 때 동일한 코드로 공유되는 자원을 할당받으며 처리하는 식으로 많이 구성하게 됩니다.

thread를 관리하는 manager를 하나 만들고 각각 업무 큐에서 할당해주는 식으로 구현하면 좋지만, 단순하게 루프문에서 쓰레드를 생성하여 처리 시 엄청난 양의 쓰레드가 발생할 수 있습니다.

이럴 떄 간단한 트릭으로 쓰레드의 limit을 정하고 제한된 쓰레드들로 loop를 돌며 처리하도록 구성할 수 있습니다. (thread 를 관리하는 친구를 만들면 되지만, 굳이 그런거 까지 필요하지 않는 경우들이 있다죠)

slice maximum job for thread

array의 each_slice 함수를 활용하면 루프문 안에서 쓰레드 수의 제한이 있는 멀티쓰레드 처럼 구현할 수 있습니다. 우선 loop를 돌 array의 데이터를 최종 쓰레드 수만큼 잘라줍니다. 그 후 잘린 데이터를 처리하는 개별 쓰레드를 생성해주면 결과적으로 최종 쓰레드 만큼 쓰레드가 생성되서 각각의 할당된 일거리를 처리하게 됩니다.

arr = (1..100).select(&:odd?)  # 총 50개의 데이터를 처리할 예정(홀수)

arr.each_slice(5) do | jobs |  # each_slice로 array의 5등분으로 짤라줌(즉 한 팩에 10개가 들어감)
  jobs.map do | number |       # jobs에는 10개의 데이터가 들어가게 됨
    Thread.new do              # 한번에 10개의 데이터를 처리하는 1개의 쓰레드가 생성됨
      sleep 1
      puts number              # 이렇게 되면 반복문으로 계속 재 호출하는데, 10개의 데이터를 처리하는 5개의 쓰레드가 생성됨
    end
  end.each(&:join)             # 모든 쓰레드가 종료될떄 까지 기다림 조인조인
end