delete_at가 제공된 인덱스에서 요소를 제거하지 않는 이유는 무엇입니까?

wpp

나는 각각 비싸고 느린 방법 을 가진 WorkerJob예제 Jobperform있습니다.

나는 10이 있다면 Jobs내에서를 @job_table나는 자신의 프로세스 내에서 5, 각각의 배치로 그들을 작동하고 싶습니다. 5 개의 프로세스 (1 개의 일괄 처리)가 종료 Jobs된 후 @job_tablewith 에서 제거하려고합니다 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첫번째 배치가 실행되기 전에. 나는 것을 볼 수 Jobs0-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
Spickermann

delete_atwhile 루프에서 사용 합니다. 무슨 일이 일어나는지 보자 :

배열이 [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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Z- 인덱스가 배치 된 요소에서 작동하지 않는 이유는 무엇입니까?

분류에서Dev

.remove ()가 요소를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

conda가 제거 된 환경에 대한 패키지를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

존재하지 않는 HashSet에서 요소를 제거하려고 할 때 런타임 오류가 발생하지 않는 이유는 무엇입니까?

분류에서Dev

Vue의 배열에서 요소를 제거 할 때 마지막 인덱스에서 전환이 발생하는 이유는 무엇입니까?

분류에서Dev

스플 라이스가 배열에서 모든 요소를 제거하는 이유는 무엇입니까?

분류에서Dev

PDO 요청에서 명명되지 않은 인덱스를 제거하는 방법은 무엇입니까?

분류에서Dev

Array.Splice ()는 인덱스 변수가 if 조건에서 확인 될 때 인덱스가 0 인 요소를 제거하지 않습니다.

분류에서Dev

arrays.splice () 함수가 요소를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

VisualStudio / Firefox가 제외 된 클래스의 코드에서 YSOD를 제공하는 이유는 무엇입니까?

분류에서Dev

ON DELETE CASCADE가 참조 된 레코드를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

일요일 06:00 UTC에 Elasticsearch에서 인덱스가 삭제되는 이유는 무엇입니까?

분류에서Dev

Kubernetes apiserver가 etcd 서버에 잘못된 인증서를 제공하는 이유는 무엇입니까?

분류에서Dev

Bootstrap의 팝 오버가 DOM에서 HTML 요소를 제거하는 이유는 무엇입니까?

분류에서Dev

React Native가 버튼 구성 요소를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

redhat 저장소가 여전히 2 년 된 부스트를 제공하는 이유는 무엇입니까?

분류에서Dev

` "hello \ r".chomp ( '')`가` "\ r"`를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

함수를 통해 생성 된 요소에서 제거 버튼이 작동하지 않는 이유는 무엇입니까? | 자바 스크립트 및 HML

분류에서Dev

가상 하드 디스크가 15GB인데 Wubi를 제거하면 디스크 공간이 확보되지 않는 이유는 무엇입니까?

분류에서Dev

인덱서가 스핑크스에서 성공적으로 인덱싱되는 동안 인덱스가 표시되지 않는 이유는 무엇입니까?

분류에서Dev

jQuery가 내 클래스를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

일부 이더넷 ISP가 지정된 MAC 주소에서만 서비스를 제공하는 이유는 무엇입니까?

분류에서Dev

extern "C"가 지정된 경우 Visual Studio에서 정의되지 않은 참조 오류를 제공하지 못하는 이유는 무엇입니까?

분류에서Dev

IntelliSense가 DataTableReader에서 Dispose를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

이 예제의 따옴표 제거 단계에서 Bash가 백 슬래시를 제거하지 않는 이유는 무엇입니까?

분류에서Dev

"cgps -s"가 결과를 제공하지 않는 이유는 무엇입니까?

분류에서Dev

부모 요소를 제거하고 Thymeleaf에 자식 요소를 유지하는 방법은 무엇입니까?

분류에서Dev

지정된 인덱스의 배열에서 요소를 삭제하는 방법은 무엇입니까? 나머지 인덱스 자체가 배열에 있습니까?

분류에서Dev

Parse_Dates가 Python에서 잘못된 결과를 제공하는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    Z- 인덱스가 배치 된 요소에서 작동하지 않는 이유는 무엇입니까?

  2. 2

    .remove ()가 요소를 제거하지 않는 이유는 무엇입니까?

  3. 3

    conda가 제거 된 환경에 대한 패키지를 제거하지 않는 이유는 무엇입니까?

  4. 4

    존재하지 않는 HashSet에서 요소를 제거하려고 할 때 런타임 오류가 발생하지 않는 이유는 무엇입니까?

  5. 5

    Vue의 배열에서 요소를 제거 할 때 마지막 인덱스에서 전환이 발생하는 이유는 무엇입니까?

  6. 6

    스플 라이스가 배열에서 모든 요소를 제거하는 이유는 무엇입니까?

  7. 7

    PDO 요청에서 명명되지 않은 인덱스를 제거하는 방법은 무엇입니까?

  8. 8

    Array.Splice ()는 인덱스 변수가 if 조건에서 확인 될 때 인덱스가 0 인 요소를 제거하지 않습니다.

  9. 9

    arrays.splice () 함수가 요소를 제거하지 않는 이유는 무엇입니까?

  10. 10

    VisualStudio / Firefox가 제외 된 클래스의 코드에서 YSOD를 제공하는 이유는 무엇입니까?

  11. 11

    ON DELETE CASCADE가 참조 된 레코드를 제거하지 않는 이유는 무엇입니까?

  12. 12

    일요일 06:00 UTC에 Elasticsearch에서 인덱스가 삭제되는 이유는 무엇입니까?

  13. 13

    Kubernetes apiserver가 etcd 서버에 잘못된 인증서를 제공하는 이유는 무엇입니까?

  14. 14

    Bootstrap의 팝 오버가 DOM에서 HTML 요소를 제거하는 이유는 무엇입니까?

  15. 15

    React Native가 버튼 구성 요소를 제공하지 않는 이유는 무엇입니까?

  16. 16

    redhat 저장소가 여전히 2 년 된 부스트를 제공하는 이유는 무엇입니까?

  17. 17

    ` "hello \ r".chomp ( '')`가` "\ r"`를 제거하지 않는 이유는 무엇입니까?

  18. 18

    함수를 통해 생성 된 요소에서 제거 버튼이 작동하지 않는 이유는 무엇입니까? | 자바 스크립트 및 HML

  19. 19

    가상 하드 디스크가 15GB인데 Wubi를 제거하면 디스크 공간이 확보되지 않는 이유는 무엇입니까?

  20. 20

    인덱서가 스핑크스에서 성공적으로 인덱싱되는 동안 인덱스가 표시되지 않는 이유는 무엇입니까?

  21. 21

    jQuery가 내 클래스를 제거하지 않는 이유는 무엇입니까?

  22. 22

    일부 이더넷 ISP가 지정된 MAC 주소에서만 서비스를 제공하는 이유는 무엇입니까?

  23. 23

    extern "C"가 지정된 경우 Visual Studio에서 정의되지 않은 참조 오류를 제공하지 못하는 이유는 무엇입니까?

  24. 24

    IntelliSense가 DataTableReader에서 Dispose를 제공하지 않는 이유는 무엇입니까?

  25. 25

    이 예제의 따옴표 제거 단계에서 Bash가 백 슬래시를 제거하지 않는 이유는 무엇입니까?

  26. 26

    "cgps -s"가 결과를 제공하지 않는 이유는 무엇입니까?

  27. 27

    부모 요소를 제거하고 Thymeleaf에 자식 요소를 유지하는 방법은 무엇입니까?

  28. 28

    지정된 인덱스의 배열에서 요소를 삭제하는 방법은 무엇입니까? 나머지 인덱스 자체가 배열에 있습니까?

  29. 29

    Parse_Dates가 Python에서 잘못된 결과를 제공하는 이유는 무엇입니까?

뜨겁다태그

보관