[Series] Elixir programming language – part 4

2 min read

elixir
elixir

Trong phần này của loạt bài viết, chúng ta sẽ tìm hiểu về concurrency và parallelism trong ngôn ngữ lập trình Elixir. Chúng ta sẽ khám phá cách Elixir hỗ trợ xử lý đồng thời và song song, cũng như các công cụ và cơ chế mà nó cung cấp để làm điều này.

Concurrency và Parallelism

Concurrency và parallelism là hai khái niệm quan trọng trong lập trình đa luồng:

  • Concurrency: Là khả năng của một hệ thống để xử lý nhiều tác vụ cùng một lúc. Trong concurrency, các tác vụ có thể được thực thi cùng một lúc, nhưng không nhất thiết phải được thực thi đồng thời.
  • Parallelism: Là khả năng của một hệ thống để thực thi nhiều tác vụ đồng thời. Trong parallelism, các tác vụ được thực thi đồng thời trên nhiều luồng hoặc bộ xử lý.

Processes và Concurrency trong Elixir

Trong Elixir, concurrency được thực hiện thông qua các processes. Mỗi process là một tiến trình riêng biệt, có thể thực hiện các công việc độc lập và giao tiếp với các process khác thông qua các cơ chế như message passing.

Dưới đây là một ví dụ đơn giản về việc tạo và quản lý các process trong Elixir:

# Tạo một process mới
pid = spawn(fn -> IO.puts("Hello from process #{inspect(self())}") end)

# Gửi một message tới process vừa tạo
send(pid, :hello)

# Nhận và xử lý message từ process
receive do
  msg -> IO.puts("Received message: #{inspect(msg)}")
end

Trong ví dụ trên, chúng ta sử dụng hàm spawn để tạo một process mới, sau đó gửi một message tới process đó bằng cách sử dụng hàm send. Process sau đó nhận và xử lý message bằng cách sử dụng cấu trúc receive.

Task và Parallelism trong Elixir

Ngoài việc sử dụng các process, Elixir còn cung cấp module Task để thực hiện các công việc đồng thời trên nhiều luồng hoặc bộ xử lý. Các task có thể được sử dụng để thực hiện các công việc mà có thể được chia nhỏ và thực thi độc lập.

Dưới đây là một ví dụ về việc sử dụng module Task trong Elixir:

# Tạo và thực thi các task đồng thời
tasks = [
  Task.async(fn -> do_something() end),
  Task.async(fn -> do_something_else() end)
]
Enum.each(tasks, &Task.await/1)

Trong ví dụ trên, chúng ta tạo và thực thi các task đồng thời bằng cách sử dụng Task.async, sau đó sử dụng Task.await để đợi cho đến khi tất cả các task hoàn thành.

Kết Luận

Trong phần này, chúng ta đã tìm hiểu về concurrency và parallelism trong ngôn ngữ lập trình Elixir. Elixir cung cấp một cách tiếp cận linh hoạt và mạnh mẽ cho việc xử lý đồng thời và song song thông qua các processes và module Task. Trong phần tiếp theo của loạt bài viết này, chúng ta sẽ khám phá các công cụ và cơ chế khác nhau trong Elixir để xây dựng ứng dụng phân tán và có tính sẵn sàng cao. Đừng quên đón chờ nhé!

Tham khảo bài viết phần trước tại link

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *