【问题标题】:Concurrency in ElmElm 中的并发性
【发布时间】:2016-08-19 10:40:17
【问题描述】:

我需要在我的“更新”函数中运行一个计算量非常大的代码。

当它运行时,我的整个应用程序会阻塞,直到它完成。

有没有办法异步运行这段代码来防止阻塞? (虽然不使用端口并留在榆树)

【问题讨论】:

  • 目前看起来有点讨厌,如果可以的话,我宁愿找到另一种方法。您不能传递更复杂类型的 elm only 字符串

标签: javascript asynchronous concurrency elm


【解决方案1】:

Elm 任务不支持抢先式多任务。

使用Process.spawn,您可以构建在用作Task.andThen 的参数时将进行上下文切换的任务。

但是,对于这些,您必须在结果任务的类型为 Task x Process.Id 的约束范围内工作,这意味着没有简单的方法可以将您的任务结果传回主应用程序。

请参阅the documentation 以获取Process.Id

【讨论】:

  • 几天前我实际上尝试过使用 Process.Id,但似乎产生了相同的阻塞效果:(
  • 嗯,现在基本没啥用了,还是卡住了……这个版本好像不行
【解决方案2】:

您可以尝试将其作为任务运行。可以先发制人地停止任务以执行应用程序的其他部分,尽管我不确定在某些使用全部 CPU 容量的情况下它们将如何工作:

DoHeavyStuff a b ->
    let
        task param1 param2 =
            Task.succeed 1
            `Task.andThen` (\_ -> Task.succeed <| expensive param1 param2)
    in
    (model, Task.perform NoOp FinishedWork (task a b))

FinishedWork result ->
    ...

【讨论】:

  • 不幸的是,它不起作用,因为在运行任务之前评估了昂贵的操作,因为 elm 是一种严格的语言。整个事情仍然阻塞:(
  • 也许可以试试 andThen 技巧? Task.suceed 1 andThen \_ -&gt; expensive
  • andThen 的右侧需要一个返回任务的函数而不是返回结果的函数:/ 似乎我们无法以这种方式摆脱它
  • 对不起,我没有添加正确的代码......让我把它放在答案本身......让我知道它是否有效
  • 你说得对......我自己试过了,似乎没有像我预期的那样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多