나는 각각 비싸고 느린 방법 을 가진 Worker
및 Job
예제 Job
가 perform
있습니다.
나는 10이 있다면 Jobs
내에서를 @job_table
나는 자신의 프로세스 내에서 5, 각각의 배치로 그들을 작동하고 싶습니다. 5 개의 프로세스 (1 개의 일괄 처리)가 종료 Jobs
된 후 @job_table
with 에서 제거하려고합니다 delete_at
.
그래도 내 구현에서 예상치 못한 것을 관찰하고 있습니다 (아래 코드 참조).
jobs:
[#<Job:0x007fd2230082a8 @id=0>,
#<Job:0x007fd223008280 @id=1>,
#<Job:0x007fd223008258 @id=2>,
#<Job:0x007fd223008208 @id=3>,
#<Job:0x007fd2230081e0 @id=4>,
#<Job:0x007fd2230081b8 @id=5>,
#<Job:0x007fd223008190 @id=6>,
#<Job:0x007fd223008168 @id=7>,
#<Job:0x007fd223008140 @id=8>,
#<Job:0x007fd223008118 @id=9>]
이것은이다 @job_table
첫번째 배치가 실행되기 전에. 나는 것을 볼 수 Jobs
0-4 (생략 출력)을 성공적으로 실행 및 종료했다. 그래서 나는 전화를 remove_batch_1
걸었고 0-4 작업 @job_table
이 에서 제거 될 것으로 기대 하지만 이것이 내가 대신 관찰하고있는 것입니다.
jobs:
[#<Job:0x007fd223008280 @id=1>,
#<Job:0x007fd223008208 @id=3>,
#<Job:0x007fd2230081b8 @id=5>,
#<Job:0x007fd223008168 @id=7>,
#<Job:0x007fd223008118 @id=9>]
i
메서드에 매개 변수를 기록했는데 0-4를 반환합니다. 그러나 delete_at
다른 작업 (0,2,4,6,8)을 제거 하는 것 같습니다 .
또한 예상대로 remove_batch_0
사용 slice!
하고 작동 하는 배치를 제거하는 또 다른 방법을 작성했습니다 .
BATCH_SIZE = 5 || ENV['BATCH_SIZE']
class Job
def initialize(id)
@id = id
end
def perform
puts "Job #{@id}> Start!"
sleep 1
puts "Job #{@id}> End!"
end
end
class Worker
def initialize
@job_table = []
fill_job_table
work_job_table
end
def fill_job_table
10.times do |i|
@job_table << Job.new(i)
end
end
def work_job_table
until @job_table.empty?
puts "jobs: "
pp @job_table
work_batch
Process.waitall
remove_batch_1
end
end
def work_batch
i = 0
while (i < @job_table.length && i < BATCH_SIZE)
fork { @job_table[i].perform }
i += 1
end
end
def remove_batch_1
i = 0
while (i < @job_table.length && i < BATCH_SIZE)
@job_table.delete_at(i)
i += 1
end
end
def remove_batch_0
@job_table.slice!(0..BATCH_SIZE-1)
end
end
Worker.new
delete_at
while 루프에서 사용 합니다. 무슨 일이 일어나는지 보자 :
배열이 [0,1,2,3,4,5]
있고 호출 하는 이미지 :
(1..3).each { |i| array.deleted_at(i) }
첫 번째 반복에서는 배열에서 첫 번째 요소를 삭제하고,이 단계 후에 배열은 다음과 같이 표시됩니다 [1,2,3,4,5]
. 다음 반복에서는 두 번째 요소를 삭제하여 [1,3,4,5]
. 그런 다음 세 번째를 삭제합니다.[1,3,5]
Array#shift
대신 사용할 수 있습니다 .
def remove_batch_1
@job_table.shift(BATCH_SIZE)
end
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다