簡體   English   中英

為什么並發haskell非確定性而並行haskell原語(par和pseq)確定性?

[英]Why is concurrent haskell non deterministic while parallel haskell primitives (par and pseq) deterministic?

不太了解Haskell中並發性和並行性的上下文中的確定性。 一些例子會有所幫助。 謝謝

處理純值時,評估順序無關緊要。 這基本上就是並行性所做的: 並行地評估純值。 與純值相反,順序通常對具有副作用的行為很重要。 同時運行操作稱為並發

舉個例子,考慮兩個動作putStr "foo"putStr "bar" 根據評估這兩個動作的順序,輸出可以是“foobar”,“barfoo”或其間的任何狀態。 輸出是不確定的,因為它取決於具體的評估順序。

作為另一個例子,考慮兩個值sum [1..10]5 * 3 無論評估這兩者的順序如何,它們總是會減少到相同的結果。 這種決定論是你通常只能用純值保證的。

並發和並行是兩回事。

並發意味着您有多個線程以非確定性方式進行交互。 例如,您可能有一個聊天服務器,其中每個客戶端由一個線程處理。 非確定性對於您嘗試建模的系統至關重要。

並行性是指使用多個線程來簡化程序運行。 但是,最終結果應與順序運行算法完全相同。

許多語言沒有並行原語,因此必須使用並發原語(如線程和鎖)來實現它。 但是,這意味着程序員必須小心確保不會意外地引入不需要的非確定性或其他並發問題。 使用像parpseq這樣的顯式並行原語,許多這些問題就會消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM