2009-07-12 35 views
5

GC OCaml áp đặt một khóa toàn cầu ngăn chặn các trình biến đổi (luồng) chạy song song mặc dù chúng có thể chạy đồng thời (xen kẽ). Tôi tin rằng điều này cũng đúng với SML/NJ và MLton nhưng không phải là PolyML, GHC, F #, Clojure và Scala.Việc triển khai ngôn ngữ chức năng nào cho phép chạy các luồng song song?

Việc triển khai ngôn ngữ chức năng khác cho phép các luồng chạy song song?

Trả lời

5

Tôi vui mừng báo cho bạn biết rằng bạn đã đúng và rằng F #, được dựa trên CLR, không bị giới hạn mà ở tất cả, và thay vào đó lợi ích từ việc đa luồng cụ thể các tính năng bao gồm async workflows, the mailboxprocessor và Thư viện song song tác vụ sắp tới (.NET 4.0) tuyệt vời.

6
+1

Dữ liệu Song song Haskell vẫn còn khá thử nghiệm, nhưng sự hỗ trợ luồng song song trong liên kết đầu tiên của bạn trưởng thành hơn nhiều. DPH được thực hiện với các luồng song song, chứ không phải ngược lại. –

+0

Cảm ơn bạn đã làm rõ rằng –

6

Cả Scala và Clojure đều đang chạy trên JVM, cho phép đồng thời thực sự mà không có bất kỳ điểm nghẽn cổ chai nào.

+0

Bạn có thể giới thiệu một liên kết đến bất kỳ điều gì về lập trình song song trong Scala không? –

+1

Scala hỗ trợ các diễn viên http://www.scala-lang.org/node/242 nếu bạn thích mô hình đó và bạn có thể sử dụng java.util.concurrency giống như bạn làm trong Java. Tôi cho rằng câu hỏi là về lập trình hàm, diễn viên thích hợp hơn. –

3

Ngoài Haskell, bạn có thể chạy đồng thời trong Erlang (Lập trình theo hướng tương tranh) và bạn cũng có thể làm như vậy trong F # bằng cách sử dụng .NET Parallel ExtensionsAsynchronous Workflows.

6

Erlang thực hiện các quy trình và quy trình xử lý riêng và cho phép hàng ngàn, hàng chục nghìn và thậm chí hàng triệu quy trình Erlang (bên trong một quy trình Hệ điều hành).

Trong SMP và máy đa lõi, Máy ảo Erlang sẽ phân bổ nhiều luồng hệ điều hành và quy trình hệ điều hành cho quá trình lên lịch và xử lý hàng đợi để tối đa hóa việc sử dụng các hoạt động đồng thời bên dưới trong kiến ​​trúc phần cứng.

Mô hình đồng thời tiếp xúc với các ứng dụng vẫn giữ nguyên, tất nhiên.

11

Có một số triển khai tốt ngoài đó. Hiện tại, người Haskell dường như nhận được kết quả tốt nhất (xem ICFP 2009 paper by Simon Marlow and others cũng như Haskell Symposium 2009 paper by Donnie Jones and others). Erlang là khá gần phía sau, đặc biệt là nếu bạn muốn đi phân phối.

Trong sáu đến mười hai tháng các câu trả lời có thể đã thay đổi :-)

+2

Những kết quả Haskell là vô giá trị: việc triển khai song song của chúng thường là các đơn đặt hàng có cường độ chậm hơn so với hầu hết các lần triển khai nối tiếp. –

+6

@Jon: bằng chứng của bạn ở đâu? –

+3

So sánh các phép đo hiệu suất được trích dẫn trong các giấy tờ bạn trích dẫn với các chương trình tương đương được viết bằng các ngôn ngữ khác. Ví dụ, bài báo thứ hai cho kết quả thực hiện cho quicksort song song (~ 14s để sắp xếp chỉ 100k ints) chậm hơn 100 lần so với một giải pháp phong nha trong hầu hết các ngôn ngữ khác. Bạn cũng có thể điểm chuẩn các chương trình song song của mình. Tôi đã làm một nghiên cứu đầy đủ về sự song song ngây thơ của Saynte áp dụng cho bốn ứng dụng Haskell của Lennart trong bộ dò tia của tôi và phát hiện ra rằng người ta ngừng mở rộng 6 lõi và tất cả những người khác dừng lại chỉ với 5 lõi. –

0

trăn không phải là một ngôn ngữ đặc biệt là chức năng, và với GIL, nó không phải là rất song song, một trong hai, nhưng kết hợp với các mô-đun multiprocessing (tiêu chuẩn từ 2.6), bạn nhận được cả hai, nhưng nó không hoàn toàn thanh lịch như các ngôn ngữ chức năng thuần túy.

Brief example:

from multiprocessing import Pool 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    pool = Pool(processes=4)    # start 4 worker processes 
    result = pool.apply_async(f, [10])  # evaluate "f(10)" asynchronously 
    print result.get(timeout=1)   # prints "100" unless your computer is *very* slow 
    print pool.map(f, range(10))   # prints "[0, 1, 4,..., 81]" 
+0

Tôi không mong đợi phản ứng này cực kỳ phổ biến, nhưng hãy giải thích một chút về những gì bạn thấy rất khó chịu về kỹ thuật này? – SingleNegationElimination

+1

Câu hỏi của tôi cụ thể về chủ đề chứ không phải là quy trình. –

+0

CPython có một vấn đề liên quan đến chủ đề hạt nhân đồng thời, ngăn chặn nó sử dụng đầy đủ. mô-đun đa xử lý cho phép bạn sử dụng một giao diện gần như giống hệt nhau với các quy trình thay vì các chuỗi để đạt được các kết quả gần giống nhau. Vấn đề này không có trong các hương vị khác của python vì chúng thiếu GIL. – SingleNegationElimination

1

Chỉ cần một số bổ sung để xác nhận phần tiếp theo của danh sách đầu cơ:

  • Poly/ML hỗ trợ bài bản địa (POSIX đề hoặc chủ đề Windows) kể từ phiên bản 5.2 (từ năm 2006). Hiện tại Poly/ML 5.5 (mùa hè 2012) đã cải thiện hỗ trợ quản lý bộ nhớ song song: một số giai đoạn GC sử dụng nhiều luồng, có sự hỗ trợ đặc biệt cho việc chia sẻ trực tuyến các giá trị không thay đổi để giảm dung lượng bộ nhớ của các ứng dụng lớn.

  • Isabelle/ML cung cấp thư viện bổ sung trong tương lai cho các chủ đề Poly/ML. Isabelle là một prover định lý tương tác, nhưng nó được tích hợp với một phiên bản tăng cường SML dựa trên Poly/ML.

Các vấn đề liên quan