Tổng quan về thread và process trong ruby

Tram Ho

Trước khi tìm hiểu ThreadProcess trong Ruby ta cần hiểu được 2 khái niệm ConcurrencyParallelism.

Concurrency vs Parallelism

Concurrency

Có thể hiểu đơn giản là Process có thể luân phiên thực hiện các task để tiết kiệm khoản thời gian “rảnh” của mỗi task.

Ví dụ khi ta nấu mì thì cần thực hiện 2 nhiệm vụ là đun nước và bóc mì và các gói gia vị bỏ vào bát. Lúc này thay vì ngồi đợi nước sôi thì trong lúc đó ta có thể chuẩn bị mì => tối ưu hóa thời gian hơn nhiều.

Hình minh họa:

Parallelism

Đơn giản là việc thực hiện nhiều task song song cùng lúc khi có nhiều Process/CPU.

Ví dụ cùng công việc nấu mì như trên nhưng có 2 người cùng làm thì một người có thể chuẩn bị mì, 1 người có thể đun nước. Do hai người cùng làm một lúc nên sẽ nhanh hơn.

Hình minh họa:

Thread vs Process

Thread

Ruby cung cấp class Thread giúp ta tạo và xử lý các thread. Vậy nhiều thread có đồng nghĩa với việc code sẽ chạy nhanh hơn không ? Cùng thử một ví dụ dưới đây:

Khi không sử dụng thread:

Khi sử dụng thread:

Ta thấy thời gian thực thi gần như tương đương, đó là vì Thread sử dụng concurrency task. Thread có 5 status là:

  • sleep: khi sử dụng Thread.stop hoặc thread đang đợi I/O
  • run: khi thread đang được thực thi
  • aborting: khi thread bị aborting (ví dụ sử dụng lệnh sleep)
  • false: khi sử dụng Thread.exit
  • nil: khi thread bị terminate khi có exception

Khi thực thi nhiều thread cùng một lúc, ruby sẽ thực hiện lần lượt từng thread một cho đến khi status không còn là run nữa. Lúc này process sẽ chuyển sang thread tiếp theo.

Do đó Thread sẽ chỉ thực sự hiệu quả khi trương trình có sử dụng request I/O như request đến một server khác, query database, đọc dữ liệu từ ổ cứng, … hoặc đơn giản là có sử dụng sleep trong code. Ví dụ:

Không sử dụng thread:

Sử dụng thread:

Process

Process sử dụng Parallelism task vì vậy nếu nhiều process được thực thi cùng lúc thì chương trình sẽ chạy nhanh hơn. Ví dụ:

Không sử dụng process:

Sử dụng 8 process:

Ta có thể thấy khi sử dụng process thì code thực thi nhanh hơn rất nhiều, tuy nhiên có phải càng nhiều process thì code càng chạy nhanh ? Ta cùng thử ví dụ:

Chia task ra làm 16 process:

Ta thấy kết quả gần như tương đương với việc sử dụng 8 process do vậy không hẳn là càng nhiều process thì code càng chạy nhanh mà còn phụ thuộc vào số core của CPU nữa.

Tài liệu tham khảo

https://naturaily.com/blog/multiprocessing-in-ruby

https://ruby-doc.org/core-2.6.3/Process.html

http://tutorials.jenkov.com/java-concurrency/concurrency-vs-parallelism.html

https://ruby-doc.org/core-2.5.0/Thread.html

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo