Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Purescript 具有并发限制的并行(Aff)执行?_Purescript - Fatal编程技术网

Purescript 具有并发限制的并行(Aff)执行?

Purescript 具有并发限制的并行(Aff)执行?,purescript,Purescript,在Aff方面,用并发进程限制实现并行执行的方式是什么?我相信std libs中没有方法,也没有找到一个完整的答案 parsequencewithmit::Array(Aff X)->Int->Aff(Array X) Aff X计算应并行进行,但不能超过给定的N个并发计算。因此,它启动N个CAL,当一个CAL完成时,下一个CAL(左侧)启动。对于这类事情,一个好的机制是,它是一个阻塞可变单元。它在概念上可以被认为是一个单元素阻塞队列 首先,AVar可以是空的,也可以是满的。您可以使用创建一个空的

在Aff方面,用并发进程限制实现并行执行的方式是什么?我相信std libs中没有方法,也没有找到一个完整的答案

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
  • 分叉N个进程,每个进程将
    AVar
    中获取一个值,并对其进行处理,然后循环。永远
  • 有一个编排器流程,它将迭代整个工作序列,并将工作项放入
    AVar
  • 当所有工作进程都忙时,orchestrator进程将向
    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中添加了细节。谢谢,这和往常一样非常有用!