Ngôn ngữ lập trình hiện đại với sự trừu tượng hóa lập trình đồng thời trực quan [đã đóng]


40

Tôi quan tâm đến việc học lập trình đồng thời, tập trung vào cấp độ ứng dụng / người dùng (không phải lập trình hệ thống). Tôi đang tìm kiếm một ngôn ngữ lập trình cấp cao hiện đại cung cấp sự trừu tượng trực quan để viết các ứng dụng đồng thời. Tôi muốn tập trung vào các ngôn ngữ làm tăng năng suất và che giấu sự phức tạp của lập trình đồng thời.

Để đưa ra một số ví dụ, tôi không xem xét một lựa chọn tốt khi viết mã đa luồng bằng C, C ++ hoặc Java vì IMHO năng suất của tôi bị giảm và mô hình lập trình của họ không trực quan. Mặt khác, các ngôn ngữ giúp tăng năng suất và cung cấp các khái niệm trừu tượng hơn như Python và mô đun đa xử lý, Erlang, Clojure, Scala, v.v. sẽ là những lựa chọn tốt.

Bạn muốn giới thiệu gì dựa trên kinh nghiệm của bạn và tại sao?

EDIT: Cảm ơn mọi người vì câu trả lời thú vị của bạn. Thật khó để đưa ra kết luận mà không thực sự cố gắng vì có nhiều ứng cử viên tốt: Erlang, Clojure, Scala, Groovy, và có lẽ Haskell. Tôi đã bình chọn câu trả lời với những lý lẽ thuyết phục nhất, nhưng tôi sẽ thử tất cả các ứng cử viên tốt trước khi quyết định chọn cái nào :)


21
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java. Tại sao? On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.Một lần nữa, tại sao? Mở rộng câu hỏi của bạn để xác định rõ hơn những gì bạn đang thực sự tìm kiếm.
yannis

2
Vì vậy, bạn có muốn học lập trình song song với tất cả các vấn đề hay bạn muốn che giấu sự phức tạp của nó và tập trung vào năng suất?
MaR

@MaR Tập trung vào năng suất và che giấu sự phức tạp :)
sakisk

Chỉ cần lưu ý rằng nhiều khái niệm quan trọng được tránh (một số có thể nói đã được giải quyết) trong một số ngôn ngữ này và do đó C thực sự là ngôn ngữ tốt nhất để học đồng thời. (Hoặc ít nhất là đối với tôi; tôi không biết đủ về tất cả các ngôn ngữ được liệt kê). Tăng năng suất thường mâu thuẫn với học tập toàn diện.
dùng606723

1
@DeadMG Giảm năng suất là vấn đề của họ. Tôi không muốn tập trung vào cú pháp của ngôn ngữ thay vì vấn đề. Tôi chắc chắn không muốn kết thúc cuộc đấu tranh với bế tắc. Một ví dụ đơn giản, tôi muốn sử dụng các câu lệnh đơn giản như begin transaction end transactionvà mọi thứ bên trong phải không có bế tắc và nói chung là thành công hay thất bại.
sakisk

Câu trả lời:


33

Bạn gần như chắc chắn nên nhìn vào Clojure - theo tôi đó là ngôn ngữ hiện đại tốt nhất cho lập trình đa lõi và nó cực kỳ hiệu quả.

Những điểm chính:

  • Đó là một ngôn ngữ chức năng , là một lợi ích cho cả đồng thời và khả năng phát triển của bạn bằng cách sử dụng trừu tượng cấp cao hơn. Nó có các cấu trúc dữ liệu liên tục hoàn toàn bất biến và các chuỗi lười biếng sẽ quen thuộc với bất kỳ ai có kinh nghiệm về các ngôn ngữ chức năng như Haskell.
  • Nó có một hệ thống bộ nhớ giao dịch phần mềm rất mới lạ để truy cập đồng thời khóa miễn phí đến trạng thái có thể thay đổi. Làm cho mã đồng thời an toàn thường đơn giản như gói nó trong một khối (dosync ....).
  • Đó là một Lisp - làm cho nó cực kỳ mạnh mẽ để tạo siêu dữ liệu và tạo mã dựa trên macro. Điều này có thể mang lại lợi thế năng suất đáng kể (bài tiểu luận của Paul Graham - "Đánh bại mức trung bình")
  • Đó là ngôn ngữ JVM - vì vậy, bạn không chỉ có quyền truy cập vào hàng loạt thư viện và công cụ khổng lồ trong hệ sinh thái Java, mà bạn còn được hưởng lợi từ nỗ lực kỹ thuật khổng lồ đã biến JVM thành một nền tảng hiệu quả cho các ứng dụng phía máy chủ đồng thời. Đối với các mục đích thực tế, điều này mang lại cho nó một lợi thế rất lớn so với các ngôn ngữ không có loại nền tảng này để xây dựng.
  • Đó là tính năng động - dẫn đến mã rất súc tích và năng suất cao. Tuy nhiên, lưu ý rằng bạn có thể sử dụng các gợi ý loại tĩnh tùy chọn cho hiệu suất nếu cần.
  • Ngôn ngữ được thiết kế xoay quanh các khái niệm trừu tượng hơi khó giải thích nhưng hiệu quả thực tế là bạn có được một tập hợp các tính năng tương đối trực giao mà bạn có thể kết hợp để giải quyết các vấn đề của mình. Một ví dụ sẽ là sự trừu tượng hóa trình tự, cho phép bạn viết mã liên quan đến mọi loại đối tượng "tuần tự" (bao gồm mọi thứ từ danh sách, chuỗi, mảng Java, chuỗi lười biếng vô hạn, các dòng được đọc từ một tệp, v.v.)
  • Có một cộng đồng tuyệt vời - hữu ích, sâu sắc nhưng quan trọng nhất là rất thực dụng - trọng tâm trong Clojure nói chung là "hoàn thành công việc".

Một số mẫu mã mini có độ nghiêng đồng thời:

;; define and launch a future to execute do-something in another thread
(def a (future (do-something)))

;; wait for the future to finish and print its return value
(println @a)

;; call two functions protected in a single STM transaction
(dosync
  (function-one)
  (function-two))

Đặc biệt, đáng để xem một hoặc nhiều video trong số này:


21
Mục đích của việc khai báo kiểu tĩnh trong các ngôn ngữ được gõ mạnh không phải là để "cải thiện hiệu suất khi cần thiết" và tôi cảm thấy mệt mỏi với những người ủng hộ Lisp đã tìm ra người rơm già đó. Khai báo kiểu có hai mục đích: để cung cấp các đảm bảo chính xác về thời gian biên dịch nhất định và để làm cho mã dễ đọc hơn, đặc biệt đối với người nào đó không phải là tác giả gốc. Hiệu suất tốt hơn vốn có mà gõ tĩnh cung cấp chỉ là một phần thưởng.
Mason Wheeler

8
Gần đây tôi đã phải làm việc với mã JavaScript của một nhà phát triển khác và đó là phần khó khăn nhất của quy trình: không có loại đối số chức năng nào, tôi phải tìm kiếm trong toàn bộ cơ sở mã để tìm ra những gì họ phải làm và những gì họ có thể làm dựa trên nơi họ được gọi đến. Đây không phải là vấn đề nếu JavaScript giữ lại hệ thống loại C ngoài cú pháp chung của nó.
Mason Wheeler

1
@MasonWheeler: IMHO nếu bạn không thể tìm ra cách gọi một hàm mà không có chú thích kiểu, đó là một vấn đề với tài liệu (hoặc thiếu nó). Ngay cả trong các ngôn ngữ gõ vịt, mọi thứ thường phải đáp ứng một số ràng buộc kiểu cấu trúc (ví dụ: phải hỗ trợ các phép toán số học, phải lặp lại được, phải lập chỉ mục, v.v.). Loại tĩnh sẽ chỉ giúp tối thiểu bởi vì họ sẽ không đưa ra nhiều gợi ý về những gì các chức năng thực hiện .
dsimcha

2
@Mason Tôi chưa bao giờ nói rằng không có lợi thế nào khác cho khai báo kiểu tĩnh. Trong thực tế tôi thích khai báo kiểu tĩnh cho chính xác các lý do bạn nêu. Tuy nhiên tôi cũng thích tăng năng suất của gõ động. Đó là một sự đánh đổi. Nếu bạn có một bộ kiểm tra tốt, tôi thường thấy rằng điều này giảm thiểu rất nhiều nhược điểm của việc gõ động cả về mặt đảm bảo tính chính xác và cung cấp mã ví dụ để giúp người mới hiểu cách sử dụng đúng. YMMV.
mikera

1
@dsimcha - giải pháp thay thế cho thiết kế xung quanh trừu tượng sẽ là thiết kế xung quanh việc triển khai cụ thể. Ví dụ, hầu hết các hàm Lisp cũ chỉ hoạt động trên các danh sách được liên kết được lưu trữ trong các ô khuyết điểm. Bạn cần các chức năng khác nhau cho các cấu trúc dữ liệu khác nhau. Trong Clojure, chức năng thư viện lõi hoạt động trên mọi thứ liên tiếp (như trong câu trả lời).
mikera

27

Bạn có thể thử D. Nó cung cấp ba mô hình. Tôi đề nghị một trong hai hoặc thứ hai.

  1. std.concurrency . Nếu bạn sử dụng mô-đun này cho tất cả các nhu cầu đồng thời của mình, thì sự kết hợp giữa ngôn ngữ và thư viện chuẩn sẽ thực thi sự cô lập giữa các luồng. Chủ đề chủ yếu liên lạc qua tin nhắn, với sự hỗ trợ hạn chế cho bộ nhớ dùng chung theo cách ưu tiên "an toàn trước hết" và không cho phép các cuộc đua dữ liệu cấp thấp. Thật không may, tài liệu về std.concurrency cần cải tiến, nhưng mô hình được ghi lại trong một chương miễn phí của cuốn sách "Ngôn ngữ lập trình D" của Andrei Alexandrescu.

  2. std . chủ nghĩa vô song . Mô-đun này được thiết kế đặc biệt cho song song đa lõi thay vì đồng thời trường hợp chung. ( Đồng thời và song song không giống nhau, mặc dù đồng thời là cần thiết để thực hiện song song. ) Vì toàn bộ điểm song song là hiệu suất, std.metism không đảm bảo sự cô lập vì chúng sẽ gây khó khăn cho việc viết mã song song hiệu quả. Tuy nhiên, nó trừu tượng hóa rất nhiều chi tiết cấp thấp dễ bị lỗi nên rất khó để xử lý nếu bạn song song hóa khối lượng công việc mà bạn đã xác minh thủ công là độc lập lẫn nhau.

  3. core.thread là một trình bao bọc cấp thấp đối với các API luồng dành riêng cho hệ điều hành. Cả std.concurrency và std.metism đều sử dụng nó dưới mui xe, nhưng tôi chỉ khuyên bạn nên sử dụng nó nếu bạn đang viết thư viện đồng thời của riêng bạn hoặc tìm thấy một số trường hợp góc lố bịch không thể thực hiện tốt trong cả std.metism hoặc std .concurrency. Không ai nên sử dụng thứ gì đó ở mức độ thấp này cho công việc hàng ngày.


Bạn nên đề cập đến tính bất biến / độ tinh khiết, lưu trữ cục bộ của luồng theo mặc định và chia sẻ áp đặt đột biến theo thứ tự liên tiếp. Thoses là ngôn ngữ hỗ trợ bị thiếu trong C / C ++ để viết mã đồng thời.
deadalnix

@deadalnix: Đối với tôi hầu hết đó là những chi tiết của mô hình std.concurrency (cách ly được thi hành). Tôi muốn giữ bài viết này súc tích.
dsimcha

Vâng thực sự không. Đồng thời yêu cầu cả thư viện VÀ hỗ trợ ngôn ngữ.
deadalnix

@deadalnix: Đúng, nhưng chúng được đặt vào vị trí chủ yếu để hỗ trợ std.concurrency.
dsimcha

23

Erlang chắc chắn là một lựa chọn tuyệt vời, nhưng thứ gì đó thực tế hơn một chút có thể là Go , ngôn ngữ mới của Google.

Nó không quá xa so với các ngôn ngữ phổ biến khác, vì vậy, thật dễ dàng để có được nếu bạn đã biết các ngôn ngữ 'dễ dàng' khác. Nhiều người so sánh nó với Python hoặc thậm chí Lua về mức độ 'thoải mái' khi lập trình.


@faif đang hỏi về cấp độ ứng dụng / người dùng, không phải hệ thống lập trình đồng thời. Làm thế nào Erlang phù hợp với điều này?
Chiron

@Raynos: Phụ thuộc vào cộng đồng.
Donal Fellows

@DonalFellows your right, tôi nghĩ rằng tuyên bố của tôi quá hẹp
Raynos

1
@Chiron: Erlang là ngôn ngữ lập trình, nó được sử dụng để tạo các ứng dụng. Thông thường, các ứng dụng đa xử lý. Tôi không biết nó phù hợp ở đâu như 'hệ thống proramming', tôi chưa từng nghe về bất kỳ HĐH nào được viết bằng Erlang.
Javier

1
Sau khi xem nhanh trong hướng dẫn Go, tôi muốn nói rằng IMHO một ngôn ngữ có cú pháp giống như C sử dụng các con trỏ (giới hạn) chắc chắn không phải là một ngôn ngữ hiện đại làm tăng năng suất.
sakisk

23

Hãy xem Lập trình song song của Microsoft cho .net. Nó rất trực quan.

Nhiều máy tính cá nhân và máy trạm có hai hoặc bốn lõi (nghĩa là CPU) cho phép thực hiện đồng thời nhiều luồng. Máy tính trong tương lai gần dự kiến ​​sẽ có nhiều lõi hơn đáng kể. Để tận dụng phần cứng của ngày hôm nay và ngày mai, bạn có thể song song mã của mình để phân phối công việc trên nhiều bộ xử lý. Trong quá khứ, song song hóa đòi hỏi thao tác cấp thấp của các luồng và khóa. Visual Studio 2010 và .NET Framework 4 tăng cường hỗ trợ cho lập trình song song bằng cách cung cấp thời gian chạy mới, các loại thư viện lớp mới và các công cụ chẩn đoán mới. Các tính năng này đơn giản hóa việc phát triển song song để bạn có thể viết mã song song hiệu quả, chi tiết và có thể mở rộng trong một thành ngữ tự nhiên mà không phải làm việc trực tiếp với các luồng hoặc nhóm luồng. http://i.msdn.microsoft.com/dynimg/IC292903.png


+1 Đây là chính xác những gì anh ấy yêu cầu. Mặc dù, khi có vấn đề xảy ra, sẽ rất khó để gỡ lỗi chúng nếu không có sự hiểu biết về đồng thời ở mức thấp hơn. Chưa kể, lấy cái này làm người mới bắt đầu C # có thể chứng minh ... thú vị.
P.Brian.Mackey

@ P.Brian.Mackey - Tôi đồng ý. Tuy nhiên, điều đó không có gì lạ, sẽ không có gì khó khăn khi so sánh điều này với việc sử dụng ORM khi người ta không hiểu đầy đủ về mô hình quan hệ và SQL ...
Otávio Décio

1
Đặc biệt là PLINQ. Mặc dù nó chỉ hữu ích cho một tập hợp nhỏ các tác vụ, nhưng nó có thể rất dễ sử dụng.
Svick

21

Cả Erlang và Scala đều có sự đồng thời dựa trên diễn viên , điều mà tôi thấy rất trực quan và dễ học.

Mô hình Actor trong khoa học máy tính là mô hình toán học về tính toán đồng thời coi "diễn viên" là nguyên thủy phổ biến của tính toán kỹ thuật số đồng thời: để đáp ứng với một thông điệp mà nó nhận được, một diễn viên có thể đưa ra quyết định cục bộ, tạo ra nhiều diễn viên hơn, gửi nhiều thông điệp hơn và xác định cách trả lời tin nhắn tiếp theo nhận được ... Nó đã được sử dụng như là một khuôn khổ cho sự hiểu biết lý thuyết về tính toán, và là cơ sở lý thuyết cho một số triển khai thực tế của các hệ thống đồng thời.


19

Tôi đang tìm hiểu về Haskell ngay bây giờ và đọc bài báo này đã thuyết phục tôi rằng Haskell là một lựa chọn tốt cho lập trình đồng thời. Bởi vì nó hoàn toàn hoạt động (hệ thống loại biết liệu một chức năng có thực hiện bất kỳ đầu vào, đầu ra hoặc đọc / sửa đổi trạng thái toàn cầu nào không), nên nó có thể thực hiện những việc như Bộ nhớ giao dịch phần mềm (tóm tắt rất độc đáo trong bài báo trên) hoạt động tương tự như các giao dịch trong cơ sở dữ liệu - bạn có được một loạt những thứ tốt đẹp như nguyên tử chỉ với một chút đường. AFAIK, chủ đề Haskell cũng rất nhẹ. Ngoài những điều này, thực tế là Haskell hoàn toàn có chức năng cho phép ngay cả các tác vụ đơn giản được chạy song song với ít hơn một từ khóa (mệnh). nguồn


7

Ngôn ngữ GO của Google có một số công cụ thú vị để đồng thời - đó sẽ là một điều thú vị khác để thử. Xem: http://golang.org/doc/effective_go.html#concurrency và đọc một chút để biết ví dụ.

Lập trình đồng thời là một chủ đề lớn và chỉ có không gian cho một số điểm nổi bật cụ thể của Go ở đây.

Lập trình đồng thời trong nhiều môi trường trở nên khó khăn bởi sự tinh tế cần có để thực hiện truy cập chính xác vào các biến được chia sẻ. Go khuyến khích một cách tiếp cận khác nhau trong đó các giá trị được chia sẻ được truyền xung quanh trên các kênh và trên thực tế, không bao giờ được chia sẻ tích cực bởi các luồng thực hiện riêng biệt. Chỉ có một con goroutine có quyền truy cập vào giá trị tại bất kỳ thời điểm nào. Cuộc đua dữ liệu không thể xảy ra, theo thiết kế. Để khuyến khích lối suy nghĩ này, chúng tôi đã giảm nó thành một khẩu hiệu:

Không giao tiếp bằng cách chia sẻ bộ nhớ; thay vào đó, chia sẻ bộ nhớ bằng cách giao tiếp.

Cách tiếp cận này có thể được thực hiện quá xa. Số lượng tham chiếu có thể được thực hiện tốt nhất bằng cách đặt một mutex xung quanh một biến số nguyên, ví dụ. Nhưng là một cách tiếp cận cấp cao, sử dụng các kênh để kiểm soát truy cập giúp dễ dàng viết các chương trình chính xác, rõ ràng hơn.

Một cách để suy nghĩ về mô hình này là xem xét một chương trình đơn luồng điển hình chạy trên một CPU. Nó không có nhu cầu đồng bộ nguyên thủy. Bây giờ chạy một ví dụ khác; nó cũng không cần đồng bộ hóa. Bây giờ hãy để hai người đó giao tiếp với nhau; nếu giao tiếp là đồng bộ hóa, vẫn không cần đồng bộ hóa khác. Đường ống Unix, ví dụ, phù hợp hoàn hảo với mô hình này. Mặc dù cách tiếp cận đồng thời của Go bắt nguồn từ Quy trình tuần tự giao tiếp (CSP) của Hoare, nhưng nó cũng có thể được coi là một sự khái quát hóa an toàn kiểu của các ống Unix ...


6

Trong phiên bản tiếp theo, C # làm cho nó thậm chí còn dễ dàng hơn biểu đồ đó. Có hai từ khóa mới Async và Await.

Async được sử dụng như một công cụ sửa đổi chức năng và cho biết "thao tác này thực hiện công việc của nó trên một luồng khác.

Await được sử dụng trong một chức năng Async, và đây là nơi phép màu xảy ra. Về cơ bản Await bảo trình biên dịch chạy hoạt động theo từ khóa trong một luồng riêng biệt và chờ kết quả. Bất kỳ mã nào sau cuộc gọi chờ sẽ chạy sau khi hoạt động.

CSONG, hoạt động đồng bộ hóa với chuỗi cuộc gọi (vì vậy nếu bạn đang thực hiện thao tác asynch để đáp ứng với một lần bấm nút, bạn không phải đăng lại thủ công giao diện người dùng). Hai từ khóa nhỏ và bạn nhận được rất nhiều sức mạnh đồng thời. Đọc thêm tại đây


Lưu ý mọi trình biên dịch OS C # phong nha đã hỗ trợ C # 5, async và đang chờ.
Raynos

Về cơ bản Await bảo trình biên dịch chạy hoạt động theo từ khóa trong một luồng riêng biệt và chờ kết quả. Tôi tự hỏi nếu câu trả lời này là chính xác - async await không phải là về chủ đề. Bài viết này giải thích rất hay: Không có chủ đề
sventevit

Điểm tốt. Tôi đoán tôi đã nói quá đơn giản về nó. Điều thực sự xảy ra là một "sự tiếp tục" được thực hiện để đăng ký vào sự kiện của nhiệm vụ trong "chờ đợi" được hoàn thành. Và có một số thao tác I / O nhất định và thread.s ngủ () (về cơ bản đáp ứng với ngắt đồng hồ) không có một luồng. nhưng những gì về Nhiệm vụ được thực hiện thủ công mà không có I / O như cho phép chúng tôi đã tạo ra một máy tính đang chờ đợi thì sao? Về mặt kỹ thuật, bài báo nói đúng "Không có chủ đề" nhưng trong thực tế không bao giờ có, nó luôn là một khái niệm chúng ta sử dụng để che giấu các chi tiết về những gì HĐH đang làm cho chúng ta.
Michael Brown

6

Tôi vẫn muốn giới thiệu C ++. Nó không chỉ có khả năng trừu tượng hóa cần thiết để viết mã đồng thời tốt. Xác suất áp đảo là bạn chỉ đơn giản là có một thư viện kém để thực hiện công việc, vì các thư viện tốt để thực hiện công việc là tương đối mới, và thực sự, kiến ​​thức để sử dụng tốt C ++ không thực sự phổ biến. TBB của Intel chỉ mới xuất hiện được vài năm và PPL của Microsoft chỉ xuất xưởng từ năm ngoái.

Nếu bạn sử dụng một cái gì đó như TBB hoặc PPL, thì mã đồng thời, không chính xác là tầm thường để viết, trong trường hợp đồng thời không bao giờ là tầm thường, nhưng lại rất khó khăn. Nếu bạn sử dụng trực tiếp các luồng pthread hoặc Win32, thì không có gì lạ khi bạn không thích nó - thực tế bạn đang viết bằng trình biên dịch với các hàm như vậy. Nhưng với PPL, khi đó bạn đang nói về các thuật toán chức năng tiêu chuẩn song song với bạn, các cấu trúc dữ liệu chung để truy cập đồng thời và đó là một thứ tốt.


1
Kiểm tra Boost.Threads hoặc C ++ 0x std::thread(hoặc std::tr1::thread). Đó thực sự là một sự trừu tượng rất tốt, IMO.
greyfade

1
@greyfade: Họ hoàn toàn không có gì trên PPL hoặc TBB. boost::threadchỉ là một trình bao bọc hệ điều hành với một chút RAII. PPL và TBB là các thuật toán đồng thời thực sự, các thùng chứa, v.v.
DeadMG

6

Một phích cắm cho Ada là cần thiết ở đây, vì nó có tất cả các khái niệm trừu tượng cấp cao nhất cho sự song song & đồng thời. mặt khác được gọi là nhiệm vụ . Cũng như OP yêu cầu trực quan (một tiêu chí chủ quan!) Tôi nghĩ rằng một cách tiếp cận khác với thế giới trung tâm java có thể được đánh giá cao.


5

Tôi sẽ đề xuất Groovy / Java / GPars nếu bạn có thể dựa trên JVM vì nó cho phép các tác nhân, dataflow, truyền đạt các quy trình tuần tự (CSP), song song dữ liệu, bộ nhớ giao dịch phần mềm (STM), các tác nhân, ... Điểm ở đây là là nhiều mô hình đồng thời và song song mức độ cao, mỗi mô hình có "điểm ngọt" khác nhau. Bạn không muốn sử dụng một mô hình không hài hòa với giải pháp cho một vấn đề bạn đang cố gắng xây dựng. Các ngôn ngữ và khung chỉ với một mô hình buộc bạn phải hack thuật toán.

Tất nhiên tôi có thể bị coi là thiên vị vì tôi là người đóng góp cho Groovy và GPars. Mặt khác, tôi làm việc với CSP và Python, xem Python-CSP.

Một điểm nữa là câu hỏi ban đầu là về học tập, không phải về việc viết một hệ thống sản xuất. Vì vậy, sự kết hợp Groovy / Java / GPars là một cách học tốt ngay cả khi công việc sản xuất cuối cùng được thực hiện trong C ++ bằng cách sử dụng một cái gì đó như Just :: Thread Pro hoặc TBB thay vì dựa trên JVM.

(Một số liên kết URL hoàn toàn hợp lý đã phải bị xóa vì một số hoảng loạn về việc spam trang web lưu trữ.)


Russel, nếu bạn muốn, bạn có thể cho tôi biết những gì bạn muốn được liên kết trong phòng Trò chuyện và tôi sẽ thêm chúng cho bạn: chat.stackexchange.com/rooms/21/programmer
Dan McGrath

4

Clojure thì sao? Bạn có thể sử dụng Swing chẳng hạn nhưng tận hưởng cơ sở lập trình đồng thời Clojure? Clojure có tích hợp Java khá tốt.

Ngoài ra, bạn đã xem xét khuôn khổ Java 7 Fork / Tham gia chưa?


2

Bạn cũng có thể muốn xem Groovy và thư viện GPars . GPars BTW có phần giống với .NET Parallel Extension được đề cập trong một câu trả lời khác, nhưng cú pháp linh hoạt của Groovys làm cho nó đọc tốt hơn trong một số trường hợp.


0

Scala đã được đề cập nhiều lần trong các câu hỏi và trong câu trả lời, nhưng tôi không thấy có liên quan đến Akka , đây là một triển khai diễn viên có thể được sử dụng với cả Scala và Java.


Có gì sai với câu trả lời này? Không có câu trả lời nào khác đề cập đến akka và akka thực hiện một sự trừu tượng hóa ở mức độ cao để lập trình đồng thời.
Giorgio

-1

Tôi nghĩ rằng nó phụ thuộc vào những gì bạn đang xây dựng. Ứng dụng máy tính để bàn, hay máy chủ? Tôi đã nghe nói rằng (nhưng không có kinh nghiệm cá nhân) node.js tuyệt vời để lập trình đồng thời cho các máy chủ (cả về cách viết mã và hiệu năng). Nếu tôi muốn viết một ứng dụng máy chủ mới, có lẽ tôi nên dùng thử. Không chắc chắn về các ứng dụng dành cho máy tính để bàn ... Tôi đã viết một số lượng lớn nội dung trong C # và có một số công cụ che giấu sự phức tạp độc đáo, mặc dù đối với các trường hợp khác, bạn phải đối phó trực tiếp với nó.


-1

Tôi có thể bị đánh vào đầu vì điều này, nhưng bạn đã đọc chương 7 của TAOUP chưa? Phần tôi nghĩ cụ thể là chủ đề so với quy trình. Tôi đã thấy rằng khái niệm xử lý đồng thời làm cho hầu hết mọi người nghĩ về các luồng, nhưng tôi chưa bao giờ thấy một trường hợp nào mà một luồng dễ sử dụng và nhanh hơn so với sinh ra một tiến trình con.

Bạn đang đưa ra tất cả các chi tiết xử lý đồng thời cho những kẻ thông minh đã xây dựng hệ điều hành của bạn. Đã có rất nhiều phương thức liên lạc tại chỗ và bạn không phải lo lắng về việc khóa tài nguyên được chia sẻ. Về cơ bản, các chủ đề là một hack hiệu quả, nằm trong quy tắc tối ưu hóa. Đừng tối ưu hóa nếu bạn chưa thử nghiệm sự cần thiết.

Tìm một thư viện quy trình con tốt, chẳng hạn như đặc phái viên cho python . Hoặc bạn chỉ có thể viết một vài chương trình riêng biệt trong C và viết một chương trình "chính" khác để sử dụng ngã ba và ống dẫn để sinh sản và giao tiếp với các quy trình con.


3
Điều này trái ngược với những gì OP rõ ràng muốn bắt đầu một quá trình chỉ ở mức độ thấp như sinh ra một luồng thủ công. OP quan tâm đến sự trừu tượng hóa mức độ cao của sự tương tranh.
Konrad Rudolph
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.