2009-12-07 13 views
8

Ngoài ra, nếu không phải là python hay java, thì bạn có thường chọn ngôn ngữ gõ tĩnh hoặc ngôn ngữ kiểu động không?Python và Java - Bạn sẽ chọn lập trình đồng thời và tại sao?

+4

bạn có coi Erlang không? – jldupont

+7

Tôi nghĩ rằng hệ thống kiểu có ít để làm với những gì làm việc tốt hơn cho concurrency. Điều đó đòi hỏi những thứ khác, imho. – Joey

+6

Tôi càng sử dụng Java, tôi càng thích Python. Tôi? gắt gỏng? Tại sao bạn hỏi? – retracile

Trả lời

25

Tôi sẽ chọn JVM trên python, chủ yếu vì đa luồng trong Python bị cản trở bởi Global Interpreter Lock. Tuy nhiên, Java không thể là tốt nhất của bạn khi chạy trên JVM. Clojure hoặc Scala (sử dụng diễn viên) đều có khả năng phù hợp hơn với các vấn đề đa luồng.

Nếu bạn chọn Java, bạn nên xem xét việc sử dụng các thư viện java.util.concurrent và tránh nguyên thủy đa luồng như đồng bộ.

+4

Vấn đề khóa thông dịch toàn cầu được giải quyết bằng cách đơn giản có nhiều hơn một trình thông dịch: D http://docs.python.org/dev/library/multiprocessing.html – badp

+1

đa luồng chắc chắn không phải là phương pháp duy nhất đồng thời –

+1

Nếu bạn sử dụng Java, nhận 'Java Concurrency in Practice' và chuẩn bị để dành 3-4 tháng để làm việc thông qua nó. Đồng thời là một vấn đề hóc búa trong bất kỳ ngôn ngữ nào. –

11

Definetely Stackless Python! Đó là một biến thể Python đặc biệt được thực hiện cho đồng thời.

Nhưng cuối cùng nó phụ thuộc vào nền tảng đích của bạn và những gì bạn đang cố gắng đạt được.

4

Nếu không Java/Python tôi sẽ đi cho một ngôn ngữ chức năng kể từ khi nhậm tác dụng phụ vào tài khoản là một trong những sự phức tạp của việc viết phần mềm đồng thời. (Theo như câu hỏi của bạn đi: điều này xảy ra được gõ theo kiểu thống kê, nhưng trình biên dịch suy giảm phần lớn thời gian)

Cá nhân tôi sẽ chọn F #, vì tôi đã thấy rất nhiều ví dụ điển hình về viết phần mềm đồng thời một cách dễ dàng bằng cách sử dụng nó.

Là phần giới thiệu: người đàn ông này là equally fun as inspiring, thậm chí phải xem nếu bạn không quan tâm đến F # như vậy bao giờ hết.

+0

Hãy nhớ rằng F # là ** hoàn toàn ** khác với python và java vì nó đòi hỏi bạn phải biết .net và có chức năng thuần túy. –

+1

F # không phải là chức năng thuần túy, bạn có thể viết bất kỳ chương trình nào với nó mà không cần viết một dòng mã chức năng. – Peter

5

Tôi không nghĩ rằng đối số là về lựa chọn ngôn ngữ hoặc gõ tĩnh hoặc động - đó là giữa hai mô hình đồng thời - bộ nhớ dùng chung và thông điệp đi qua. Mô hình nào có ý nghĩa hơn trong trường hợp của bạn & ngôn ngữ bạn đã chọn có cho phép bạn lựa chọn hoặc bạn buộc phải áp dụng một mô hình này qua mô hình khác không?

Tại sao không xem Erlang (có nhập động) và message passing, Actor model và đọc tại sao Joe Armstrong doesn't like shared memory. Ngoài ra còn có một cuộc thảo luận thú vị về java concurrency sử dụng khóa và chủ đề here on SO.

Tôi không biết về Python, nhưng Java, cùng với các mô hình khóa và mô hình sẵn có, có khung truyền đi qua mesasge có tên là Kilim.

2

Tôi sẽ sử dụng Java, thông qua Jython. Java có khả năng chủ đề mạnh mẽ, và nó có thể được viết bằng cách sử dụng cú pháp Python với Jython, vì vậy bạn có được tốt nhất của hai thế giới.

Bản thân Python không thực sự tốt với đồng thời và chậm hơn so với Java.

Nhưng nếu bạn có vấn đề tương tranh và rảnh tay, tôi sẽ có một cái nhìn tại Erlang bởi vì nó đã được thiết kế cho các vấn đề như vậy. Tất nhiên, bạn phải xem xét Erlang chỉ nếu bạn có:

  • thời gian để làm chủ một (rất) công nghệ mới
  • kiểm soát trên một phần hợp lý của chuỗi sản xuất, vì Erland cần một số thích nghi trong hộp công cụ của bạn để phù hợp với
+0

@ user359996 nhận xét của bạn có thể cho một số người ấn tượng rằng Jython không thể xử lý đồng thời. Nó có thể, giống như Java. Tôi yêu Jython vì nó cung cấp cho bạn sức mạnh của tất cả các lớp Java được thiết kế sẵn, bao gồm Swing, vv, kết hợp với ngữ nghĩa của Python. Đôi khi tôi tò mò về cách mọi người xử lý GUI đơn giản bằng Python vì bản chất của GUI chắc chắn là đa luồng ... Tôi đã có kết quả tuyệt vời với Jython ... bất kỳ mô-đun thực sự nhanh nào có thể được viết bằng Java và tích hợp rất dễ dàng. .. –

9

Để đồng thời, tôi sẽ sử dụng Java. Bằng cách sử dụng Java, tôi thực sự có nghĩa là Scala, vốn vay rất nhiều từ các cấu trúc đồng thời của Erlang, nhưng (có thể) dễ tiếp cận hơn với một nhà phát triển Java chưa từng sử dụng trước đây.

Chủ đề Python phải chờ Khóa thông dịch toàn cục, thực hiện đồng thời đúng (trong một quy trình) không thể thực hiện được đối với các chương trình liên kết CPU. Theo tôi hiểu, Stackless Python giải quyết một số (mặc dù không phải tất cả) thiếu hụt đồng thời của CPython, nhưng như tôi đã không sử dụng nó, tôi không thể thực sự tư vấn về nó.

1

Đối với một số tác vụ, Python quá chậm. Chương trình Java đơn luồng của bạn có thể nhanh hơn phiên bản Python đồng thời trên một máy tính đa lõi ...

Tôi muốn sử dụng Java hoặc Scala, F # hoặc đơn giản là đi tới C++ (MPI và OpenMPI).

1

Môi trường Java (JVM + thư viện) là tốt hơn cho đồng thời hơn (C) Python, nhưng ngôn ngữ Java hút. Tôi có lẽ sẽ đi với một ngôn ngữ khác trên JVM - Jython đã được đề cập, và Clojure và Scala đều có hỗ trợ tuyệt vời cho đồng thời.

Clojure đặc biệt tốt - nó có hỗ trợ cho cấu trúc dữ liệu liên tục hiệu suất cao, đại lý và bộ nhớ giao dịch phần mềm. Nó là một ngôn ngữ động nhưng bạn có thể đưa ra các gợi ý kiểu để có được hiệu suất tốt như Java.

Xem this video trên InfoQ bởi Richard Hickey (tác giả của Clojure) về các vấn đề với cách tiếp cận truyền thống để đồng thời và cách Clojure xử lý nó.

1

Tôi sẽ xem xét Mục tiêu-C và Khung nền tảng. Không đồng bộ, lập trình đồng thời cũng được cung cấp cho.

Điều này tất nhiên phụ thuộc vào quyền truy cập của bạn vào Công cụ nhà phát triển của Apple hoặc GnuStep, nhưng nếu bạn có quyền truy cập vào một trong hai đó là một lộ trình tốt để thực hiện với lập trình đồng thời.

2

Không. Lập trình đồng thời nổi tiếng là khó để có được chính xác. Có tùy chọn sử dụng ngôn ngữ lập trình theo định hướng quy trình như occam-pi dựa trên ý tưởng của communicating sequential processespi calculus. Điều này cho phép kiểm tra thời gian biên dịch cho bế tắc và nhiều vấn đề khác phát sinh trong quá trình phát triển hệ thống đồng thời. Nếu bạn không thích occam-pi, mà tôi không thể đổ lỗi cho bạn nếu bạn không, bạn có thể thử Go ngôn ngữ mới từ google mà cũng thực hiện một phiên bản của CSP.

+0

Kiểm tra thời gian biên dịch cho bế tắc ?! Tôi tò mò muốn nghiên cứu về cách hoạt động – Setzer

1

Câu trả lời là tùy thuộc. Ví dụ như bạn đang cố gắng tận dụng lợi thế của nhiều lõi hoặc cpus trên một máy tính duy nhất hoặc bạn có muốn phân phối tác vụ của mình trên nhiều máy không? Làm thế nào quan trọng là tốc độ so với dễ thực hiện?

Như đã đề cập trước đó, Python có Khóa phiên dịch toàn cục nhưng bạn có thể sử dụng mô-đun multiprocessing. Lưu ý rằng trong khi Stackless rất tuyệt, nó tự nó won't utilise multiple cores. Python thường được coi là dễ dàng hơn để làm việc với hơn Java. Nếu tốc độ là một ưu tiên Java thường nhanh hơn.

Thư viện java.util.concurrent trong Java giúp viết các ứng dụng đồng thời trên một máy đơn giản hơn nhưng bạn vẫn cần phải đồng bộ hóa xung quanh bất kỳ trạng thái chia sẻ nào. Trong khi Java không nhất thiết phải là ngôn ngữ tốt nhất cho đồng thời, có rất nhiều công cụ, thư viện, tài liệu và các phương pháp hay nhất để giúp bạn.

Sử dụng tính năng truyền thông báo và bất biến thay vì chuỗi và trạng thái được chia sẻ được coi là cách tiếp cận tốt hơn để lập trình ứng dụng đồng thời. Các ngôn ngữ chức năng ngăn cản sự biến đổi và các tác dụng phụ thường được ưu tiên. Nếu phân phối các ứng dụng đồng thời của bạn trên nhiều máy là một yêu cầu, bạn nên xem xét các thời gian chạy được thiết kế cho ví dụ này. Erlang hoặc Scala Actors.