问题标签 [stm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
127 浏览

exception - 在 catch 子句中获取变量

您好,我需要编写函数,而不是通过 tcp 发送和接收消息,如果连接断开,则自动重新连接。消息取自 STM Channel

我的问题是,如果连接断开,我会丢失从频道中读取的“c”。所以在catch子句中我不想像 unGetTchan 这样的东西,但在这段代码中,'c' 没有被捕获。你能建议“haskellic”的方式来做这样的事情吗?

FUZxxl 消息后更新

在 FUZxxl 发表评论后,我将函数重写为下一个形式

现在它对我有用。谢谢

0 投票
1 回答
920 浏览

scala - 大型共享状态的 scala/akka/stm 设计?

我是 Scala 和 Akka 的新手,正在考虑使用它来解决问题。假设我有一个计算引擎(搜索解决方案)。我想通过为每个节点上的每个 cpu 提供自己的引擎实例来并行化跨 cpu 和跨节点的搜索。

引擎输入由少量标量输入和一个非常大的哈希表组成。每个引擎实例将使用其标量输入对哈希表进行一些小的本地更改,计算一个优点,然后丢弃其更改(它们不需要被任何其他引擎实例提交/看到)。善值将返回给将在结果中进行选择的某个协调器。

我正在阅读一些关于 STM TransactionalMap 作为共享状态工具的信息。这似乎很理想,但我并没有真正看到任何完整的示例将其用作共享状态。

问题:

  • actor/stm 模型似乎适合这个问题吗?
  • 你能举一个具体的例子来说明如何分配共享状态吗?(它是 Ref[TransactionalMap[,]] 作为消息吗?
  • 在节点内分配共享状态与在不同节点之间分配共享状态有什么不同吗?

求知之心,

艾伦

0 投票
2 回答
6470 浏览

haskell - TVar 和 TMVar 的区别

我已经看到 theTVar是一个简单的容器,而 theTMVar与 an 相同MVar,这意味着它有一个锁等,但在STMmonad 中。我想知道为什么有必要这样做,因为它的想法STM是使锁变得不必要。

那么,如果你说有一个类型,比如[Handle]你想在线程之间使用的套接字句柄列表,那么使用forkIO哪个?

0 投票
2 回答
2679 浏览

scala - 为什么 Scala 无法实例化伴随对象?

我是 Scala 和 Akka 的新手,所以如果这是一个新手问题,请原谅我,但我在其他任何地方都找不到答案......

作为记录,我使用的是 Scala 2.9.0-1 和 Akka 1.1.3,并且还包括了我的 SBT 0.10.1 设置。

我已经在 Akka 中编写了此消息后面的代码作为实验;它是用户数据库和注册工具的玩具版本。基本思想是有一个由 UserServer 演员组成的 ActorPool,每个演员都有一个 MemoryUserDatabase 的实例,该实例使用 STM 与用户的电子邮件地址的用户地图进行交互——很简单,对吧?

可以通过编译文件并在两个单独的控制台中运行以下命令来重现该问题:

控制台#1:

导入 toy.service.user._; ServiceRunner.run

控制台#2:

导入 toy.service.user._; ClientRunner.run

这是服务器控制台的输出 (#1)

使用 Scala 2.9.1.final 时,该错误会稍微有趣一些:

代码的这个操作部分是:

我不明白为什么无法初始化伴随对象。最奇怪的部分是你可以做同样的事情,但是如果在服务器控制台(#1)中你首先访问 Companion 对象:

内存用户数据库

在您运行 ServerRunner 之前,它初始化得很好,随后其他一切都只是花花公子。

谁能解释这是为什么?

谢谢!伊丹

PS。这是我的第一个 Scala 代码,所以尽量不要笑得太厉害......欢迎任何其他建议(风格、哲学、神学......)。

0 投票
1 回答
256 浏览

unit-testing - 纯粹测试 STM 功能

我最近开始在我的一个项目中使用 STM 作为一些位,但我无法弄清楚如何测试它。

我在这些函数中没有 IO,并希望我可以编写 QuickCheck 属性来测试事物,但是“原子地”(STM a -> IO a)似乎是从 STM monad 中获取任何东西的唯一方法。

这可能吗,还是我应该只用 HUnit 编写测试?

0 投票
1 回答
546 浏览

akka - Akka,线程调度程序,代理最佳实践

我已经在 Scala 中涉足了一段时间,并且从远处研究了 Akka,并且终于投入其中。FSM 特性为我敲定了交易。让我担心的是,我可能已经设想过如何不恰当地共享数据,并且我可能已经错误地设想了事件处理循环以匹配 Akka 最佳实践。

在我的问题中,我有一个中央协调器,他会将传入的任务请求匹配到也是有限状态机的适当参与者。我最初假设 onTransition 不仅会给出状态名称,还会给出状态数据。

我想传统的数据封装将是不将该数据暴露给听众的原因。但对我来说,我有两个用途让其他人看到这些数据。

状态数据包含一个基础域对象,其属性用于根据其要求确定哪些参与者是处理工作的最佳人选。由于工作要求是动态的,我对单独收集工人演员犹豫不决(尽管我不确定为什么这会让我停下来)。

查询所有满足其他先决条件的单独参与者并加入所有回复的想法对 Akka 来说效率低下或至少不习惯。我还需要在 UI 中显示当前状态,并且没有理由使用相同的事件队列来查看状态。

无论如何,我正在考虑让 FSM 更新一个代理,但由于那是一个演员本身,我不确定那层间接会给我带来什么,而且它可能会使对事件顺序的推理变得更加困难。

Fowler 的 Event Collaboration 指出我要明确发送状态数据,但我希望有一种更简单的方法来为所有自动更新状态数据的转换执行此操作。

我也很难理解事件级联的顺序,以及我是否需要控制它。即使我所有传入的外部事件都来自单个参与者,我仍希望在处理下一个外部事件之前将所有内部生成的事件处理给所有其他参与者。我正在考虑让中央协调员使用!等待回复,但我担心如果不小心删除了事件链中某处的一个感叹号,我将失去该保证。

我正在考虑解决此问题的解决方案包括使用优先级事件,以便为内部事件赋予更高的优先级,对所有共享的“内部”参与者使用单线程调度程序(可能是工作窃取?)。

我正在尝试做的事情是否涉及最佳实践,或者我是否尝试做错误的事情:)?

0 投票
2 回答
430 浏览

haskell - 将 Par monad 与 STM 和确定性 IO 一起使用

我正在为一项作业编写报告,其中我使用 STM 包实现了并发多核分支定界算法,并且遇到了一个问题。

使用 STM 的实现显然在 IO monad 中,因为它同时使用 STM 的“原子”和并发的“forkIO”,但它是确定性的。尽管使用了共享内存变量,对于相同的输入,函数的最终结果总是相同的。

我的问题是,在退出 IO 时,除了“unsafePerformIO”之外,我还有哪些选择?我是否应该尝试将其从 IO monad 中取出,因为使用多个内核可能会影响其他没有相同确定性保证的并发代码。

我听说过 Par monad 包(虽然没有使用过),但是 IO monad 中存在 STM,为了获得线程安全的全局变量,我唯一可以替代 STM 的方法是 MVars(我知道),它也存在于 IO monad 中。

0 投票
1 回答
328 浏览

scala - 禁用 Akka STM (Multiverse) 的日志记录

我正在使用akka stm,当我的应用程序启动时它会打印出来(到stderr):

如何禁用它(日志记录)?

0 投票
1 回答
2383 浏览

multithreading - Haskell:STM事务中无限期阻塞的线程

有什么方法可以增加时间间隔,RTS 在此基础上决定线程在 STM 事务中无限期阻塞?这是我的代码:

forkManaged确保同时运行的托管线程的数量不超过maxThreadsCount。它工作正常,直到重载。在重负载下,RTS 会引发异常。我认为在重负载下,在激烈的并发资源竞争中,一些线程没有时间访问 STM 上下文。所以我认为,增加 RTS 决定抛出此异常的时间间隔可能会解决问题。

0 投票
1 回答
248 浏览

java - Proguard 在 Scala 代码上崩溃,具体取决于 Multiverse STM

我正在尝试使用 Proguard 优化一些依赖于 Multiverse STM (0.6.2) 的 Scala 代码。我将 STM 与 akka 结合使用。当我尝试这样做时,我收到以下错误:

我正在使用以下标志进行优化:

你知道这个问题的解决方法吗(除了明显的-dontoptimize)?

提前致谢!