我很难想出一个真实的并发示例:
想象一下上面的情况,那里有很多车道,很多路口和大量的车.此外,还有一个人为因素.
问题是交通工程师的一个艰难的研究领域.当我在一段时间前调查它时,我注意到许多模型都失败了.当人们谈论函数式编程时,我会想到上述问题.
你能在Haskell中模拟它吗?Haskell真的如此并发吗?在Haskell中并行化这些并发事件的限制是什么?
Chris Smith.. 6
我不确定究竟是什么问题.Haskell 98没有为并发指定任何内容.像GHC这样的特定实现提供了实现并行性和并发性的扩展.
为了模拟交通,它将取决于您在模拟中需要什么,例如,如果您想要跟踪单个车辆或以一般统计方式进行,无论您是想使用刻度线还是连续模型的时间等等.从那里,你可以想出你的数据的表示,这些数据可以用于并行或并发评估.
GHC提供了多种方法来利用多个硬件执行单元,从传统的信号量和互斥量,到具有轻量级线程的通道(可用于实现像Erlang这样的actor模型),软件事务内存,到纯函数并行表达式评估,以及策略和实验嵌套数据并行.
所以,是的,Haskell有许多并行执行的方法,当然可以用于流量模拟,但是在为并发模拟选择最佳数字表示之前,您需要清楚地了解您要做的事情.每种方法都有自己的优点和局限,包括学习曲线.您甚至可能会发现并发性对于模拟的规模来说是过度的.
我不确定究竟是什么问题.Haskell 98没有为并发指定任何内容.像GHC这样的特定实现提供了实现并行性和并发性的扩展.
为了模拟交通,它将取决于您在模拟中需要什么,例如,如果您想要跟踪单个车辆或以一般统计方式进行,无论您是想使用刻度线还是连续模型的时间等等.从那里,你可以想出你的数据的表示,这些数据可以用于并行或并发评估.
GHC提供了多种方法来利用多个硬件执行单元,从传统的信号量和互斥量,到具有轻量级线程的通道(可用于实现像Erlang这样的actor模型),软件事务内存,到纯函数并行表达式评估,以及策略和实验嵌套数据并行.
所以,是的,Haskell有许多并行执行的方法,当然可以用于流量模拟,但是在为并发模拟选择最佳数字表示之前,您需要清楚地了解您要做的事情.每种方法都有自己的优点和局限,包括学习曲线.您甚至可能会发现并发性对于模拟的规模来说是过度的.
听起来像你正在尝试进行模拟,而不是现实世界的并发.这种事情通常使用离散事件模拟来解决.几年前我在Haskell做过类似的事情,并基于continuation monad变换器推出了我自己的离散事件仿真库.我担心它由我的雇主拥有,所以我不能发布它,但它并不太难.延续实际上是一个挂起的线程,所以定义这样的东西(从内存):
type Sim r a = ContT r (StateT ThreadQueue IO a) newtype ThreadQueue = TQ [() -> Sim r ()]
状态内的ThreadQueue保存当前调度的线程的队列.您还可以使用其他类型的线程队列来保存未调度的线程,例如在信号量中(基于"IORef(Int,ThreadQueue)").一旦拥有信号量,就可以构建相当于MVars和MQueues的信号量.
要安排线程使用"callCC"."callCC"的参数是一个函数"f1",它本身将函数"c"作为参数.这个内部参数"c"是延续:调用它恢复线程.当你这样做时,从该线程的角度来看,"callCC"只是将你给出的值作为参数返回给"c".实际上,您不需要将值传递回挂起的线程,因此参数类型为null.
所以你对"callCC"的论证是一个lambda函数,它接受"c"并将它放在适合你正在做的动作的任何队列的末尾.然后它从状态内部获取ThreadQueue的头部并调用它.你不必担心这个函数返回:它永远不会.