Ruby 프로젝트에서 최대한의 성능을 얻으려면 섬유 및 작동 방식을 살펴봐야 합니다.
간단한 질문부터 시작하겠습니다...
섬유란 무엇입니까?
Fibers는 작업자이며 코드를 실행하고 자신의 진행 상황을 추적합니다. 즉, 섬유는 동시성 메커니즘입니다.
네!
스레드처럼. 실보다 섬유를 더 많이 제어할 수 있다는 차이점이 있습니다.
어떤 의미에서 더 많은 통제력이 있습니까?
음.
운영 체제는 스레드를 실행할 때와 일시 중지할 때를 결정합니다.
섬유는 그렇지 않습니다!
언제 실행하고 언제 멈출지를 광섬유에 정확히 알려야 합니다.
섬유 대 스레드
스레드는 백그라운드에서 실행되고 있는 것처럼 느껴집니다.
섬유는 그렇지 않습니다.
광섬유가 실행되는 동안 중지할 때까지 메인 프로그램이 됩니다.
코드 예제를 살펴보겠습니다!
섬유 사용:예
Fiber.new
로 Fiber 생성 &블록.
예 :
f = Fiber.new { puts 1 }
그런 다음 resume
을 사용하여 광섬유를 실행합니다. 방법.
좋아요 :
f.resume
이것은 1
을 출력합니다. &메인 프로그램에 대한 제어를 반환합니다.
하지만 어떻게 섬유질을 막을 수 있습니까?
Fiber.yield
yield
와 다른 메소드 블록에 사용되는 키워드입니다.
예 :
f = Fiber.new { puts 1; Fiber.yield; puts 2 } f.resume # 1 f.resume # 2
그러면 1
이 인쇄됩니다. resume
으로 광섬유를 시작한 후 , 중지합니다.
resume
을 호출하면 다시...
그것은 왼쪽에서 정확히 계속되고 2
를 인쇄합니다. .
참고 :이 광섬유를 다시 시작하면 FiberError: dead fiber called
가 발생합니다. 더 이상 실행할 코드가 없기 때문입니다.
이것이 섬유가 유용한 이유입니다!
Fiber.yield
호출 광섬유 내부는 일시 중지 버튼을 누르는 것과 같습니다. 루프 중간 또는 광섬유 블록 내부에 작성하는 모든 코드에서 중지할 수 있습니다.
섬유 및 루프:끝없는 시퀀스
이 "일시 중지 버튼" 효과를 사용하여 무한 시퀀스를 만들 수 있습니다.
재료 :
- 섬유
- 루프
- 카운터
예:계승 :
factorial = Fiber.new do count = 1 loop do Fiber.yield (1..count).inject(:*) count += 1 end end
resume
으로 이 광섬유를 원하는 만큼 사용할 수 있습니다. 메서드를 사용하여 시퀀스의 다음 번호를 가져옵니다.
예 :
Array.new(5) { factorial.resume } # [1, 2, 6, 24, 120]
좋아요!
광섬유 및 IO:비동기 작업
광섬유는 네트워크 연결과 같이 기다려야 하는 작업에 대해 스레드보다 빠르고 효율적입니다.
왜?
광섬유를 사용하면 컨텍스트 전환이 줄어들기 때문입니다.
컨텍스트 전환은 CPU가 현재 작업에서 다른 작업으로 변경될 때입니다.
비용은 적지만 추가됩니다!
Linux의 perf 도구를 사용하여 몇 가지 테스트를 수행한 결과 간단한 Ruby 애플리케이션에서 Fiber가 스레드보다 3배 적은 컨텍스트 전환을 생성한다는 것을 발견했습니다.
좋은가요?
지금 바로 광섬유 사용을 시작할 수 있습니다. :
IO.select
메소드 + Reactor 디자인 패턴- 비동기 보석 사용
- 팔콘 애플리케이션 서버 사용
기억하세요...
마법의 총알은 없지만 섬유가 당신을 위해 무엇을 할 수 있는지 테스트하고 볼 가치가 있습니다 🙂
요약
Ruby의 Fibers에 대해 배웠습니다! Fiber를 사용하면 자신의 의지에 따라 일시중지 및 재개할 수 있는 코드 단위를 생성할 수 있습니다. .
이제 여러분이 시도해 볼 차례입니다.
읽어주셔서 감사합니다!