Ruby Limit to number of thread in loop(반복문에서 제한된 갯수의 쓰레드 돌리기)
보통 쓰레드는 개별단위의 처리 수행이나 고 성능의 작업(요청을 엄청나게 전송한다는 둥, 빠른 계산이 필요한다는 둥)이 필요할 때 동일한 코드로 공유되는 자원을 할당받으며 처리하는 식으로 많이 구성하게 됩니다.
thread를 관리하는 manager를 하나 만들고 각각 업무 큐에서 할당해주는 식으로 구현하면 좋지만, 단순하게 루프문에서 쓰레드를 생성하여 처리 시 엄청난 양의 쓰레드가 발생할 수 있습니다.
이럴 떄 간단한 트릭으로 쓰레드의 limit을 정하고 제한된 쓰레드들로 loop를 돌며 처리하도록 구성할 수 있습니다. (thread 를 관리하는 친구를 만들면 되지만, 굳이 그런거 까지 필요하지 않는 경우들이 있다죠)
우선 loop를 돌 array의 데이터를 최종 쓰레드 수만큼 잘라줍니다. 그 후 잘린 데이터를 처리하는 개별 쓰레드를 생성해주면 결과적으로 최종 쓰레드 만큼 쓰레드가 생성되서 각각의 할당된 일거리를 처리하게 됩니다.
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