Câu hỏi Multi-Core và Concurrency - Ngôn ngữ, Thư viện và Kỹ thuật Phát triển


Khung cảnh kiến ​​trúc CPU đã thay đổi, nhiều lõi là một xu hướng sẽ thay đổi cách chúng ta phải phát triển phần mềm. Tôi đã thực hiện phát triển đa luồng trong C, C ++ và Java, tôi đã thực hiện phát triển đa tiến trình bằng cách sử dụng các cơ chế IPC khác nhau. Cách tiếp cận truyền thống của việc sử dụng các chủ đề dường như không làm cho nó dễ dàng, cho các nhà phát triển, sử dụng phần cứng hỗ trợ một mức độ cao của đồng thời.

Ngôn ngữ, thư viện và kỹ thuật phát triển nào mà bạn biết là giúp giảm bớt những thách thức truyền thống trong việc tạo ra các ứng dụng đồng thời? Tôi rõ ràng đang nghĩ về các vấn đề như deadlocks và điều kiện chủng tộc. Kỹ thuật thiết kế, thư viện, công cụ, vv cũng thú vị giúp thực sự tận dụng và đảm bảo rằng các tài nguyên sẵn có đang được sử dụng - chỉ cần viết một ứng dụng luồng an toàn, mạnh mẽ không đảm bảo rằng nó đang sử dụng tất cả các lõi có sẵn.

Những gì tôi đã thấy cho đến nay là:

  • Erlang: dựa trên quy trình, thông điệp truyền qua IPC, mô hình đồng thời của diễn viên
  • Kịch bản: diễn viên thư viện mô hình cho Ruby và Python
  • Scala: ngôn ngữ lập trình hàm cho JVM với một số hỗ trợ đồng thời bổ sung
  • Clojure: ngôn ngữ lập trình hàm cho JVM với thư viện tác nhân
  • Mối: một cổng của phương pháp tiếp cận quá trình Erlang và thông điệp đi qua để Scheme

Bạn biết điều gì khác, điều gì đã làm việc cho bạn và bạn nghĩ điều gì thú vị khi xem?


35
2017-09-23 15:19


gốc


Bạn đang tạo ra sự đồng thời và song song. - Jon Harrop
Tôi nghĩ rằng có phần không chính xác khi nói rằng Clojure có một "thư viện diễn viên" - trên thực tế, toàn bộ ngôn ngữ được thiết kế hiệu quả xung quanh sự tương tranh và bất biến. Đáng xem infoq.com/presentations/Value-Identity-State-Rich-Hickey để hiểu thêm một số triết lý. - mikera
+1 mikera .... Clojure hỗ trợ tác nhân, chứ không phải diễn viên. Với các diễn viên bạn gửi dữ liệu đến một thực thể để nói với thực thể đó biến đổi một số dữ liệu khác. Với các tác nhân, bạn gửi các hàm tới một thực thể để thay đổi trạng thái của thực thể đó. - Timothy Baldridge


Các câu trả lời:


Tôi muốn đề xuất hai thay đổi mô hình:

Bộ nhớ giao dịch phần mềm

Bạn có thể muốn xem khái niệm về Bộ nhớ giao dịch phần mềm (STM). Ý tưởng là sử dụng đồng thời lạc quan: bất kỳ hoạt động nào chạy song song với những người khác đều cố gắng hoàn thành công việc của mình trong giao dịch bị cô lập; nếu tại một thời điểm nào đó, một giao dịch khác đã được cam kết làm mất hiệu lực dữ liệu mà giao dịch này đang hoạt động, công việc của giao dịch sẽ bị hủy bỏ và giao dịch lại chạy.

Tôi nghĩ rằng việc thực hiện rộng rãi đầu tiên được biết đến của ý tưởng (nếu không phải là bằng chứng-of-khái niệm và đầu tiên) là một trong Haskell: Các bài báo và bài thuyết trình về bộ nhớ giao dịch trong Haskell. Nhiều triển khai khác được liệt kê trên Bài viết STM của Wikipedia.

Vòng lặp sự kiện và lời hứa

Một cách khác để xử lý đồng thời được thực hiện bằng [ngôn ngữ lập trình E] (http://en.wikipedia.org/wiki/E_(programming_language%29).

Lưu ý rằng cách của nó đối phó với đồng thời, cũng như các phần khác của thiết kế ngôn ngữ, là rất nhiều dựa trên mô hình diễn viên.


11
2017-09-24 15:18





Bạn đã đề cập đến Java, nhưng bạn chỉ đề cập đến các chủ đề. Bạn đã xem thư viện đồng thời của Java chưa? Nó đi kèm với Java 5 trở lên.

Đó là một thư viện rất đẹp chứa ThreadPools, CopyOnWriteCollections để đặt tên rất ít. Xem tài liệu tại Hướng dẫn Java. Hoặc nếu bạn thích, tài liệu Java.


9
2017-09-23 15:25





Một số nội dung dựa trên Scala:


7
2017-10-18 22:37





Tôi đã sử dụng Chế biến cho Python. Nó bắt chước API của luồng và do đó khá dễ sử dụng.

Nếu bạn tình cờ sử dụng map/imap hoặc máy phát / danh sách hiểu, chuyển đổi mã của bạn để sử dụng processing rất đơn giản:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

có thể được song song với

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

mà sẽ sử dụng nhiều bộ vi xử lý bạn phải tính toán kết quả. Ngoài ra còn có lười biếng (Pool.imap) và các biến thể không đồng bộ (Pool.map_async).

Có một lớp xếp hàng thực hiện Queue.Queuevà công nhân tương tự như chủ đề.

Gotchas

processing được dựa trên fork(), được mô phỏng trên Windows. Đối tượng được chuyển qua pickle/unpickle, vì vậy bạn phải chắc chắn rằng nó hoạt động. Ngã ba một quá trình đã có được tài nguyên đã có thể không phải là những gì bạn muốn (nghĩ rằng các kết nối cơ sở dữ liệu), nhưng nói chung nó hoạt động. Nó hoạt động rất tốt đến nỗi nó đã được thêm vào Python 2.6 trên đường đua nhanh (cf. PEP-317).


6
2017-09-23 15:32



Cảm ơn, điều này rất hữu ích - âm thanh như ý tưởng có thể được chia sẻ với Dramatis. - Kyle Burton
Sẽ rất hay khi đề cập đến hậu duệ của nó - 2.6 multiprocessing mô-đun. - Constantin


Intel Threading khối xây dựng cho C ++ trông rất thú vị với tôi. Nó cung cấp một mức độ trừu tượng cao hơn nhiều so với các luồng thô. O'Reilly có rất sách hay nếu bạn thích tài liệu cây chết. Xem thêm, Bất kỳ trải nghiệm nào với các khối xây dựng luồng của Intel?.


4
2017-09-23 15:36





Tôi sẽ nói:

Mô hình: chủ đề + trạng thái chia sẻ, diễn viên + thông điệp trôi qua, bộ nhớ giao dịch, bản đồ / giảm? Ngôn ngữ: Erlang, Io, Scala, Clojure, Reia Thư viện: Retlang, Jetlang, Kilim, Cilk ++, ngã ba / tham gia, MPI, Kamaelia, Terracotta

Tôi duy trì một blog liên kết đồng thời về các công cụ như thế này (Erlang, Scala, luồng Java, mô hình diễn viên, vv) và đưa lên một vài liên kết mỗi ngày:

http://concurrency.tumblr.com


4
2017-09-23 20:23



Người ta nên lưu ý rằng Kamaelia không QUITE ở đó về hỗ trợ đa lõi. Nó vẫn còn rất thử nghiệm để nói rằng ít nhất. - Jason Baker


Câu hỏi Bạn nên giới thiệu mô hình lập trình song song nào hôm nay để tận dụng lợi thế của các bộ xử lý đa lõi của ngày mai? đã được yêu cầu. Tôi đưa ra câu trả lời sau đây.

Kamaelia là một python framework để xây dựng các ứng dụng với nhiều quy trình giao tiếp.

http://www.kamaelia.org/cat-trans-medium.png Kamaelia - Đồng thời có ích, thú vị

Trong Kamaelia bạn xây dựng hệ thống từ các thành phần đơn giản nói chuyện với nhau. Tốc độ này phát triển, hỗ trợ ồ ạt và cũng có nghĩa là bạn xây dựng phần mềm đồng thời tự nhiên. Nó có thể được truy cập bởi bất kì nhà phát triển, bao gồm cả người mới. Nó cũng làm cho nó thú vị :)

Loại hệ thống nào? Máy chủ mạng, ứng dụng khách, ứng dụng dành cho máy tính để bàn, trò chơi dựa trên pygame, hệ thống chuyển mã và đường ống, hệ thống truyền hình kỹ thuật số, công cụ xóa spam, công cụ giảng dạy và số tiền hợp lý hơn :)

Đây là một đoạn video từ Pycon 2009. Nó bắt đầu bằng cách so sánh Kamaelia với Twisted và Parallel Python và sau đó đưa ra một cuộc biểu tình của Kamaelia.

Dễ dàng đồng thời với Kamaelia - Phần 1 (59:08)
Đồng thời dễ dàng với Kamaelia - Phần 2 (18:15)


4
2017-09-25 23:38





Tôi đã làm chương trình đồng thời ở Ada gần 20 năm nay.

Bản thân ngôn ngữ (không phải một số thư viện trên thư viện) hỗ trợ luồng ("nhiệm vụ"), nhiều mô hình lập lịch biểu và nhiều mô hình đồng bộ hóa. Bạn thậm chí có thể xây dựng các lược đồ đồng bộ hóa của riêng bạn bằng cách sử dụng các bản dựng sẵn có sẵn.

Bạn có thể nghĩ về Ada điểm hẹn như là một cơ sở đồng bộ hóa theo định hướng theo thủ tục, trong khi đối tượng được bảo vệ có nhiều hướng đối tượng hơn. Rendezvous tương tự như khái niệm CS cũ của màn hình, nhưng mạnh mẽ hơn nhiều. Các đối tượng được bảo vệ là các kiểu đặc biệt với các nguyên tắc đồng bộ hóa cho phép bạn xây dựng những thứ chính xác như ổ khóa hệ điều hành, các semaphores, các sự kiện, vv Tuy nhiên, nó đủ mạnh để bạn có thể sáng tạo và tạo các loại đối tượng đồng bộ của riêng mình. .


4
2018-04-28 16:55





Tôi đang theo dõi sát sao Các phần mở rộng song song cho .NET và LINQ song song.


3
2017-09-23 15:32