gpt4 book ai didi

haskell - 向并行代码添加进度条 (Haskell)

转载 作者:行者123 更新时间:2023-12-03 17:22:19 26 4
gpt4 key购买 nike

在 Haskell 中,我有一个可以并行计算的列表。每个单独的评估不需要那么长时间,但有很多(例如,100 万)。我正在使用以下 library .该计划将列表拆分为多个块并并行运行它们。我有类似以下的东西:

import Control.Parallel.Strategies
import Control.DeepSeq

-- Imagine this being slightly more expensive
kindaExpensiveComputation :: Int -> [Int]
kindaExpensiveComputation n = replicate n 42

main :: IO ()
main = do
let n = 1000000
let args = replicate n 20
let chunkSize = n `div` 10
let result = force $ withStrategy (parListChunk chunkSize rseq) . map kindaExpensiveComputation $ args
-- do stuff with result here
-- end program
我想为此添加一个进度条,以便我可以跟踪已完成的列表数量。我的直觉是尝试以下操作:
import Control.Parallel.Strategies
import Control.DeepSeq
import System.ProgressBar

-- Imagine this being slightly more expensive
kindaExpensiveComputation :: ProgressBar s -> Int -> IO [Int]
kindaExpensiveComputation pb n = do
let res = replicate n 42
incProgress pb 1
return res

main :: IO ()
main = do
let n = 1000000
let args = replicate n 20
let chunkSize = n `div` 10
pb <- newProgressBar defStyle 10 (Progress 0 n ())
let result = force $ withStrategy (parListChunk chunkSize rseq) . map (kindaExpensiveComputation pb) $ args
-- do stuff with result here
-- end program
但是 force似乎无法处理 IO .我尝试了其他一些事情,但无论我尝试什么都会评估 IO [Int] 的列表并行但不是 IO 的实际内容.我看到并行库有一些功能,比如 withStrategyIO ,虽然我不确定如何使用它,或者它是否是我正在寻找的。
我认为我对 Haskell 如何评估表达式的理解引起了我的困惑,因此任何有关此的指示也会有所帮助。

最佳答案

不幸的是,我相信 GHC 目前没有公开任何用于观察(显然在 IO 中)并行计算的评估进度的功能。您将需要以 forkIO 的形式使用并发和 friend (或像 async 包一样包装它们的库)。

关于haskell - 向并行代码添加进度条 (Haskell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66923101/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com