gpt4 book ai didi

parallel-processing - 为什么在进行并行计算时打印到控制台会混淆?

转载 作者:行者123 更新时间:2023-12-04 08:12:44 26 4
gpt4 key购买 nike

在运行一些执行并行计算的代码时,输​​出变得乱码:不同的消息混淆了。这是一个示例:

Iteration 1
Iteration
Iteration 23 of 19 - Calculating P&L for test window ending at 10/28/1968 12:00:00 AM

of
Iteration 4
Iteration of
Iteration 5
Iteration
Iteration 19 - Calculating P&L for test window ending at of 19 - Calculating P&L for test window ending at 5/29/1974 12:00:00 AM
6 of 878/18/1971 12:00:00 AM19 - Calculating P&L for test window ending at 3/4/1977 12:00:00 AM


of 19 of
of 19 - Calculating P&L for test window ending at 6/25/1985 12:00:00 AM

当顺序运行同一个程序时,控制台输出结果很好,没有乱码。

通过这个函数打印到控制台:

let windowTrainTest (comm: Communication) critFoo count (model: IModel) (assets: Assets) (paramList: Parameters list) =
// Deleted some code here
if comm = Verbose then
let msg1 = sprintf "\nwindowTrainTestPandL: First date: %A, Last date: %A\nBest Criterion: %.2f\n" fDate lDate bestCriterion
let msg2 = sprintf "Best Parameters: %A\n" bestParameters
printfn "%s" <| msg1 + msg2

(pandl, wgts), bestParameters, ( ["Criterion", bestCriterion] |> Map.ofList,
["FirstDate", fDate; "LastDate", lDate] |> Map.ofList )

并行化是由这部分程序完成的:

let pSeqMapi f (xs: seq<'T>) = xs |> PSeq.mapi f

let trainTest n i (trainSize, fullSize) =
let takenAssets = assets |> Assets.take (min fullSize len)
lastDate takenAssets
|> printfn "\nIteration %d of %d - Calculating P&L for test window ending at %A\n" (i + 1) n
paramList
|> windowTrainTest comm' critFoo trainSize model takenAssets

let mapTrainTest (initSizes: (int * int) list) =
let f = trainTest initSizes.Length
match calcType with
| PSeq -> initSizes |> pSeqMapi f |> List.ofSeq
| _ -> initSizes |> Seq.mapi f |> List.ofSeq

有没有办法避免这种行为,例如将消息刷新到控制台?

最佳答案

并行计算在不同的线程上运行,如果一个线程在 printfn 中间被中断,而第二个线程在第一个线程再次运行之前运行 printfn ,那么它们的输出将交错。

处理这个问题的最简单方法是创建一个新函数,它将在 printfn 调用周围使用 lock 关键字:

let lockObj = new obj()
let lockedPrintfn msg = lock lockObj (fun _ -> printfn msg)

然后用 lockedPrintfn 替换您所有的 printfn 调用,您应该得到您期望的序列化输出。您的性能会受到一点影响,因为您的线程偶尔会花费一些时间等待 printfn 锁,但只要您的计算花费的时间明显长于打印输出所花费的时间,您实际上就不会注意到性能稍慢。

关于parallel-processing - 为什么在进行并行计算时打印到控制台会混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686849/

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