Purescript 具有并发限制的并行(Aff)执行?
在Aff方面,用并发进程限制实现并行执行的方式是什么?我相信std libs中没有方法,也没有找到一个完整的答案Purescript 具有并发限制的并行(Aff)执行?,purescript,Purescript,在Aff方面,用并发进程限制实现并行执行的方式是什么?我相信std libs中没有方法,也没有找到一个完整的答案 parsequencewithmit::Array(Aff X)->Int->Aff(Array X) Aff X计算应并行进行,但不能超过给定的N个并发计算。因此,它启动N个CAL,当一个CAL完成时,下一个CAL(左侧)启动。对于这类事情,一个好的机制是,它是一个阻塞可变单元。它在概念上可以被认为是一个单元素阻塞队列 首先,AVar可以是空的,也可以是满的。您可以使用创建一个空的
parsequencewithmit::Array(Aff X)->Int->Aff(Array X)
Aff X
计算应并行进行,但不能超过给定的N个并发计算。因此,它启动N个CAL,当一个CAL完成时,下一个CAL(左侧)启动。对于这类事情,一个好的机制是,它是一个阻塞可变单元。它在概念上可以被认为是一个单元素阻塞队列
首先,AVar
可以是空的,也可以是满的。您可以使用创建一个空的,然后使用“填充”一个值。这里有用的一点是,当您调用put
并且AVar
已经“满”时,put
将阻塞,直到它再次为空
Second,您可以使用读取值,这将返回值,但同时将AVar
保留为空。与put
类似,如果AVar
为空,take
将阻塞,直到满为止
因此,您可以使用它执行以下操作:
AVar
从AVar
中获取一个值,并对其进行处理,然后循环。永远
AVar
AVar
中推送另一个值,然后尝试推送下一个值,但此时将被阻止,因为AVar
已满。它将保持被阻止状态,直到其中一个工作进程完成其工作并调用take
获取下一个工作项,使AVar
为空。这将取消阻止orchestrator进程,该进程将立即将下一个工作项推送到AVar
,依此类推
这里缺少的一点是如何停止。如果工作过程只是无限循环,它们将永远不会退出。当orchestrator进程最终耗尽工作并停止填充AVar
时,工作进程将永远阻塞take
调用。不太好
为了解决这个问题,有两种工作项-(1)实际工作和(2)命令停止处理。然后让orchestrator进程首先推送所有工作项,完成后,按N个命令停止。(可选)您可以按N+1命令停止:这将确保orchestrator进程阻塞,直到最后一个辅助进程完成
将所有这些放在一起,这里是一个演示程序:
modulemain其中
进口序曲
导入数据。数组((..)
导入数据。可折叠(用于)
导入数据.Int(toNumber)
进口效应
导入效应.AVar(AVar)
导入效果.Aff(Aff,毫秒(..),延迟,forkAff,launchAff)
进口影响。Aff.AVar作为AVar
导入效果。类(liftefect)
导入效果控制台(日志)
数据功a=功a |完成
过程::Int->AVar(工作Int)->Aff单元
进程myIndex v=do
W
纯单位
我所做的工作
liftefect$log$“Worker”show myIndex:正在处理“show i”
延迟$毫秒$toNumber i
liftefect$log$“Worker”show myIndex:Processed“show i
进程myIndex v
主要影响单位
main=launchAff\uuudo
var forkAff$进程idx var
让输入=[1002003000040010002000101102103104]
对于\uuInputs\i->AVar.put(工作i)变量
对于(1..6)\->AVar.put Done var
在这个程序中,我的工作项只是数字,表示睡眠的毫秒数。我将此用作处理每个工作项的“昂贵”程度的模型。程序输出如下:
Worker 1: Processing 100
Worker 2: Processing 200
Worker 3: Processing 300
Worker 4: Processing 300
Worker 5: Processing 400
Worker 1: Processed 100
Worker 1: Processing 1000
Worker 2: Processed 200
Worker 2: Processing 2000
Worker 3: Processed 300
Worker 3: Processing 101
Worker 4: Processed 300
Worker 4: Processing 102
Worker 5: Processed 400
Worker 5: Processing 103
Worker 3: Processed 101
Worker 3: Processing 104
Worker 4: Processed 102
Worker 5: Processed 103
Worker 3: Processed 104
Worker 1: Processed 1000
Worker 2: Processed 2000
你能澄清一下“并发进程限制”在这种情况下的含义吗?也许描述一下你试图解决的一个具体问题?我在OP中添加了细节。谢谢,这和往常一样非常有用!