Sử dụng Clojure thay vì Python vì lý do khả năng mở rộng (đa lõi), ý tưởng tốt? [đóng cửa]


8

Sau khi đọc http://clojure.org/rationale và các so sánh hiệu suất khác giữa Clojure và nhiều ngôn ngữ, tôi bắt đầu nghĩ rằng, ngoài việc dễ sử dụng, tôi không nên viết mã bằng Python nữa mà thay vào đó là Clojure. Thật ra, tôi bắt đầu cảm thấy vô trách nhiệm vì không học Clojure, thấy nó có lợi.

Liệu nó có ý nghĩa? Tôi không thể sử dụng hiệu quả tất cả các lõi bằng cách sử dụng một ngôn ngữ cấp bách hơn như Python, hơn là một phương ngữ Lisp hoặc ngôn ngữ chức năng khác? Dường như tất cả các lợi ích của nó đến từ việc sử dụng dữ liệu bất biến, tôi không thể làm điều đó trong Python và có tất cả các lợi ích?

Tôi đã từng bắt đầu học một số Lisp thông thường, đọc và thực hiện hầu hết tất cả các bài tập từ một cuốn sách tôi mượn từ thư viện trường đại học của tôi (tôi thấy nó khá hay, mặc dù nó phổ biến thấp trên Amazon). Nhưng, sau một thời gian, tôi thấy mình phải vật lộn quá nhiều để làm một số việc đơn giản. Tôi nghĩ rằng có những thứ bắt buộc hơn trong bản chất của chúng, điều đó gây khó khăn cho việc mô hình hóa những thứ đó một cách có chức năng.

Vậy Python có mạnh như Clojure để xây dựng các ứng dụng tận dụng tương lai đa lõi mới này không?

Lưu ý rằng tôi không nghĩ rằng việc sử dụng semaphores, cơ chế khóa hoặc cơ chế tương tranh tương tự khác là những lựa chọn thay thế tốt cho việc song song hóa 'tự động' của Clojure.


5
Dựa trên những gì bạn dường như đang cố gắng thực hiện, bạn thực sự nên nhìn vào erlang .
Jerry Coffin

2
Vẫn chưa có ở đây và có thể không bao giờ hoạt động tốt, nhưng các kế hoạch STM của những người PyPy (tốt, chủ yếu là một: Armin Rigo) nghe có vẻ hay và có liên quan rõ ràng đến câu hỏi này.

Câu trả lời:


4

Tôi không thể sử dụng hiệu quả tất cả các lõi bằng một ngôn ngữ cấp bách hơn như Python, hơn là một phương ngữ hay ngôn ngữ chức năng khác?

Bạn chắc chắn có thể . Tùy thuộc vào loại vấn đề (ví dụ: xử lý các phần có thể phân tách rõ ràng của một số nhiệm vụ tính toán lớn song song), nó thậm chí có thể khá dễ dàng. Tôi đoán hầu hết các đồng thời trên thế giới vẫn được thực hiện trực tiếp bằng các ngôn ngữ bắt buộc, mặc dù mô hình đang chuyển sang các giải pháp chức năng.

Python không được biết đến chính xác với khả năng tương tranh của nó, mặc dù. Một ví dụ về ngôn ngữ mệnh lệnh được thiết lập tốt với sự hỗ trợ đồng thời tuyệt vời là Java.

Dường như tất cả các lợi ích của nó đến từ việc sử dụng dữ liệu bất biến, tôi không thể làm điều đó trong Python và có tất cả các lợi ích?

Thủ thuật với dữ liệu bất biến là, nếu bạn làm điều đó với các cấu trúc dữ liệu đơn giản, truyền thống như mảng, bạn sẽ kết thúc với việc sao chép và thu gom rác khổng lồ, làm hỏng hiệu suất. Thay vào đó, bạn muốn dữ liệu bất biến hiệu quả , có thể được thực hiện với các cấu trúc dữ liệu liên tục khác nhau , như được thực hiện trong Clojure dưới mui xe. Các cấu trúc như vậy có thể được thực hiện bằng hầu hết mọi ngôn ngữ như thư viện, nhưng tất nhiên hỗ trợ ngôn ngữ trực tiếp luôn đẹp hơn.


8

Python cực kỳ tệ đối với các ứng dụng cần nhiều luồng, nhưng nguyên nhân là do sự thiếu hụt trong các máy ảo có sẵn chứ không phải ngôn ngữ. Các trình tạo của Python thực sự sẽ là ứng cử viên tốt cho việc song song hóa. Vấn đề là việc triển khai tiêu chuẩn, CPython, chỉ có thể thực thi mã python trên một CPU, chỉ các cuộc gọi trong thư viện riêng mới có thể chạy song song. Thời gian chạy PyPy có kế hoạch sửa nó, nhưng vẫn chưa có và trong khi việc triển khai Jython và IronPython không có giới hạn, chúng không hoàn chỉnh (chúng không có nhiều thư viện chuẩn, bạn phải sử dụng thư viện chuẩn của môi trường lưu trữ trong đó).

Tuy nhiên, có nhiều ngôn ngữ khác được thiết kế và thực hiện song song. Tất nhiên song song dễ dàng hơn nhiều trong các ngôn ngữ chức năng, đó là lý do tại sao tất cả các ngôn ngữ có hỗ trợ song song tốt đều là chức năng hoặc có hỗ trợ mạnh mẽ cho lập trình chức năng. Tôi có thể nghĩ về:

  • Haskell , ngôn ngữ chức năng thuần túy, không nghiêm ngặt được sử dụng nhiều nhất. Bản chất không nghiêm ngặt thuần túy của nó cho phép trình biên dịch song song một số điều ngầm.
  • Erlang là một ngôn ngữ chức năng nghiêm ngặt được thiết kế đặc biệt để triển khai các máy chủ song song mạnh mẽ, với sự hỗ trợ tích hợp để phân phối cho các cụm.
  • Clojure, tất nhiên. Giống như các lisps khác, nó được thiết kế để lập trình chức năng, nhưng cũng hỗ trợ lập trình bắt buộc.
  • Go là một ngôn ngữ thủ tục được biên dịch mới được thiết kế cho sự tương tranh, mặc dù cả thời gian chạy và ngôn ngữ đều chưa trưởng thành.
  • Rust là một ngôn ngữ thủ tục được biên dịch mới được thiết kế để đồng thời, chi phí thấp và kiểm tra tĩnh bộ nhớ và an toàn đồng thời. Cũng chưa trưởng thành lắm.

Go vừa được phát hành 1.0 sau khoảng hai năm phát triển nguồn mở.
Sonia

1
Và Python có gói đa xử lý.
Sonia

Tôi thực sự không biết rằng haskell có thể nhanh (nhanh hơn trăn). Tôi đã "học" nó trong khóa học đầu tiên về lập trình, tôi chắc chắn cần phải xem lại nó.
Julio Coleues

1
@Vandell: Haskell là một ngôn ngữ được biên dịch tĩnh, do đó, nó sẽ nhanh hơn. Theo Trò chơi Điểm chuẩn Ngôn ngữ Máy tính , Haskell gần như tương đương với Java và Mono.
Jan Hudec

@Sonia: ... đó là những gì tôi gọi là không trưởng thành. Thông thường phải mất 10 năm hoặc hơn để đặc tả ngôn ngữ để giải quyết. Tôi ít nhất mong đợi Đi theo Java và C # và nhận được thuốc generic một ngày nào đó.
Jan Hudec

2

Những người ở đây đã đưa ra câu trả lời thực sự xuất sắc.

Lập trình đồng thời thường khó vì "trạng thái chia sẻ". Lập trình chức năng có thể không phải là câu trả lời cuối cùng nhưng nó chắc chắn làm cho nó có thể thực hiện được mà không bị rụng tóc.

Clojure chắc chắn là một lựa chọn khả thi nhưng ngay cả với các công cụ tương tranh tuyệt vời của nó, bạn có thể cần phải xây dựng một cái gì đó khác. Kiểm tra Prismatic cho một ví dụ:

Lựa chọn ngôn ngữ phụ trợ của chúng tôi là Clojure trên JVM. Có các ngôn ngữ chức năng tuyệt vời khác trên JVM, như Scala, nhưng điều chúng tôi thích ở Clojure là nó có một lõi nhỏ, đơn giản tập trung xung quanh việc xử lý dữ liệu được biểu thị trong tập hợp cấu trúc dữ liệu bền vững tuyệt vời của nó (hoặc tương đương java.util có thể thay đổi của chúng, khi cần đình công). Mặc dù chúng tôi sử dụng rất nhiều lõi của Clojure, chúng tôi không sử dụng các nguyên hàm đồng thời của nó (nguyên tử, refs, STM, v.v.) vì một chức năng như pmap không có đủ quyền kiểm soát chi tiết tốt cho nhu cầu của chúng tôi. Thay vào đó, chúng tôi chọn xây dựng các bản tóm tắt đồng thời của riêng mình trong Clojure trên gói java.util.conc hiện nổi bật.

Nếu bạn thực sự muốn đi hoang, thì hãy kiểm tra Ngôn ngữ lập trình Julia .

Julia không áp đặt bất kỳ phong cách song song cụ thể nào lên người dùng. Thay vào đó, nó cung cấp một số khối xây dựng chính cho tính toán phân tán, làm cho nó đủ linh hoạt để hỗ trợ một số kiểu song song và cho phép người dùng thêm nhiều hơn.


2

Ngoài những gì Jan Hudec đã viết, tôi muốn đề cập đến Scala , bên cạnh một phong cách lập trình chức năng, cũng hỗ trợ một phong cách lập trình hướng đối tượng / bắt buộc.

Scala cung cấp sự song song thông qua các tác nhân (cũng được sử dụng bởi Erlang).

Lưu ý rằng tôi không nghĩ rằng việc sử dụng semaphores, cơ chế khóa hoặc cơ chế tương tranh tương tự khác là những lựa chọn thay thế tốt cho việc song song hóa Clojure 'tự động'.

Các tác nhân là một cách trừu tượng hướng đối tượng từ các luồng / tiến trình cơ bản: về cơ bản bạn chỉ thấy các đối tượng chạy đồng thời và gửi tin nhắn cho nhau. Vì vậy, nếu bạn muốn một cách thực hiện song song hướng đối tượng, tôi cũng sẽ xem xét các ngôn ngữ (hoặc khung) hỗ trợ mô hình diễn viên.

Bạn có thể tìm thấy một số liên kết trên wikipedia , đối với Python có ví dụ Pykka .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.