Computer >> Máy Tính >  >> Lập trình >> Ruby

Những điều mọi người nên biết về sợi trong Ruby

Nếu bạn muốn đạt được hiệu suất cao nhất từ ​​các dự án Ruby của mình, chúng tôi phải khám phá các sợi và cách chúng hoạt động.

Hãy bắt đầu với một câu hỏi đơn giản…

Sợi là gì?

Sợi là công nhân, họ chạy mã và theo dõi tiến trình của chính họ. Nói cách khác, sợi là một cơ chế đồng thời.

Vâng!

Cũng giống như các chủ đề. Với sự khác biệt là bạn có nhiều quyền kiểm soát hơn đối với các sợi so với các sợi.

Bạn có nhiều quyền kiểm soát hơn theo nghĩa nào?

Chà.

Hệ điều hành của bạn quyết định khi nào chạy các chuỗi và khi nào thì tạm dừng chúng.

Đó không phải là trường hợp của sợi!

Bạn phải cho một sợi quang biết chính xác khi nào nên chạy và khi nào dừng lại.

Sợi so với Chủ đề

Các chủ đề có cảm giác như chúng đang chạy trong nền, đang thực hiện công việc của mình.

Sợi không làm như vậy.

Trong khi một sợi quang đang chạy, nó sẽ trở thành chương trình chính cho đến khi bạn dừng nó.

Hãy xem một ví dụ về mã!

Sử dụng sợi:Một ví dụ

Tạo một sợi quang với Fiber.new &một khối.

Ví dụ :

f = Fiber.new { puts 1 }

Sau đó, chạy cáp quang bằng cách sử dụng resume phương pháp.

Như thế này :

f.resume

Điều này in 1 &nó trả lại quyền kiểm soát cho chương trình chính của bạn.

Nhưng làm cách nào để ngăn chặn chất xơ?

Với Fiber.yield , khác với yield từ khóa được sử dụng cho các khối.

Ví dụ :

f = Fiber.new { puts 1; Fiber.yield; puts 2 }

f.resume
# 1

f.resume
# 2

Thao tác này sẽ in 1 sau khi khởi động sợi quang với resume , sau đó dừng lại.

Nếu bạn gọi resume một lần nữa…

Nó sẽ tiếp tục chính xác từ nơi nó rời đi &in 2 .

Lưu ý :Tiếp tục lại sợi quang này vào lần khác dẫn đến FiberError: dead fiber called vì không còn mã nào để chạy.

Đây là lý do tại sao sợi hữu ích!

Gọi Fiber.yield bên trong một sợi giống như nhấn một nút tạm dừng. Cho phép bạn dừng ở giữa các vòng lặp hoặc bất kỳ mã nào bạn viết bên trong khối sợi quang.

Sợi &Vòng lặp:Chuỗi vô tận

Chúng ta có thể sử dụng hiệu ứng “nút tạm dừng” này để tạo một chuỗi vô hạn.

Thành phần :

  • Sợi
  • Vòng lặp
  • Bộ đếm

Ví dụ:số giai thừa :

factorial =
Fiber.new do
  count = 1

  loop do
    Fiber.yield (1..count).inject(:*)
    count += 1
  end
end

Bạn có thể sử dụng sợi này bao nhiêu lần tùy thích, với resume để lấy số tiếp theo trong dãy.

Ví dụ :

Array.new(5) { factorial.resume }

# [1, 2, 6, 24, 120]

Tốt!

Fibers &IO:Async Operations

Sợi nhanh hơn và hiệu quả hơn luồng cho những thứ bạn phải chờ đợi, như kết nối mạng.

Tại sao?

Vì các sợi dẫn đến ít chuyển đổi ngữ cảnh hơn.

Chuyển đổi ngữ cảnh là khi CPU thay đổi từ tác vụ hiện tại sang tác vụ khác.

Điều này có một chi phí nhỏ, nhưng nó sẽ tăng lên!

Tôi đã thực hiện một số thử nghiệm bằng cách sử dụng công cụ hoàn thiện của Linux và tôi nhận thấy rằng trong một ứng dụng Ruby đơn giản, các sợi tạo ra các chuyển mạch ngữ cảnh ít hơn 3 lần so với các luồng.

Nghe hay không?

Bạn có thể bắt đầu sử dụng sợi ngay bây giờ :

  • Với IO.select phương pháp + mẫu thiết kế Lò phản ứng
  • Với viên ngọc không đồng bộ
  • Với máy chủ ứng dụng falcon

Hãy nhớ…

Không có viên đạn thần kỳ nào, nhưng nó đáng để thử nghiệm và xem sợi có thể làm gì cho bạn 🙂

Tóm tắt

Bạn đã học về Fibers trong Ruby! Sợi cho phép bạn tạo một đơn vị mã có thể tạm dừng &tiếp tục theo ý muốn của bạn .

Bây giờ đến lượt bạn thử cái này.

Cảm ơn vì đã đọc!