【问题标题】:automatic lifting of expressions in scala for concurrency自动提升scala中的表达式以实现并发
【发布时间】:2012-10-28 23:53:28
【问题描述】:

我想以透明的方式并行评估任何函数的参数(不更改任何源代码级别)。

例如 -
c = f(a, b) 应该会导致:
ab 被并行评估,然后调用 f

一种方法是将上面的表达式转换为:

a' = future { a }
b' = future { b }
f' = lift f 

(这样f: a -> b -> c 就变成了f: Future<a> -> Future<b> -> Future<c>) 这样c' = f'(a', b')

这可以在scala中做到吗?

【问题讨论】:

  • 试图做到这一点透明地可以说是违背了Scala的原则——你最好以简洁优雅地.
  • “透明”是什么意思?狂热的并行性是一种产生大量废热的绝妙方法,并且比串行程序花费的时间要长得多。所以大概你打算指定哪些函数有资格并行化?
  • 以防万一有人认为“哦,并行化一切都没什么大不了的,我们将弥补我们在小东西上失去的大东西”——天真地并行化 math.max 与期货比串行math.max 长整整 100,000 倍。这很难恢复。

标签: scala expression future lifting


【解决方案1】:

假设您可以使用 Scala 2.10(尚未发布,但直到发布候选版本 2)并且乐于使用实验性功能,使用 Scala 的macro system 应该很容易实现。

【讨论】:

  • 是的,我之前看过 Scala 的宏系统,看起来很有前途。
  • 我只关心 IO 并发而不是并行化。因此,a 和 b 可能是一些 IO 命令(磁盘/文件访问、远程过程调用等)。我想要实现两件事:a)线程在等待 IO 时应该被阻塞 - 可以使用用户级线程库来完成,例如python 2 中的 gevent) 安排尽可能多的 IO 调用(仅在需要时等待先前的 IO 结果)。所以,我可以标记需要特别处理的 IO 调用。但这仍然需要连接表达式评估。没有?
  • 所以,我认为,问题是您为什么希望这一切透明地发生。尽管我确定您可以使用宏来做到这一点,但(真的)这对您有什么好处?正如 Rex 在他对您的问题的评论中所说的那样 - 您最好以明确但简洁优雅的方式为目标。
猜你喜欢
  • 2015-11-29
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 2013-08-27
相关资源
最近更新 更多