我对没有副作用的功能程序进行了recently asked培训,并了解了这对于使并行化任务变得微不足道是什么意思。具体来说,“纯”功能使这个问题变得微不足道,因为它们没有副作用。

我最近也在研究LINQ和lambda表达式,因为我在这里涉及枚举的StackOverflow上多次运行示例。这让我想知道并行化枚举或循环现在在C#中是否可以“轻松”进行。

lambda表达式是否“纯粹”到足以实现琐碎的并行化?也许这取决于您对表达式的处理方式,但是它们是否足够纯净?从理论上讲,在C#中这样的事情是可能的/琐碎的吗?

  • 将循环分成多个块
  • 运行一个线程以循环遍历每个块
  • 运行一个函数,该函数使用来自
    每个线程的当前循环位置

  • 例如,假设我在游戏循环中有一堆对象(在开发游戏时,我正在考虑使用多个线程的可能性),并且必须在每个帧中对每个对象进行一些操作,那么上面的内容就变得微不足道了离开?看着IEnumerable似乎只跟踪当前位置,所以我不确定我可以使用普通的通用集合将枚举分解为“块”。

    对不起,这个问题。我在上面使用了项目符号,而不是伪代码,因为我什至不知道怎么写伪代码。我的.NET知识纯粹是简单的业务知识,我对委托(delegate)和线程等并不陌生。我主要想知道上述方法是否适合追求目标,以及委托(delegate)/lambda是否不必担心何时涉及到它们的并行化。

    最佳答案

    首先,请注意,为了“纯净”一种方法,不仅必须没有副作用。给定相同的参数时,它还必须始终返回相同的结果。因此,例如,“Math.Sin”方法是纯方法。您输入12,它会返还sin(12),并且每次都相同。即使没有副作用,方法GetCurrentTime()也不纯。无论您传入什么参数,每次调用时它都会返回一个不同的值。

    还应注意,纯方法实际上不应抛出任何异常。就我们的目的而言,异常算作是可观察到的副作用。

    其次,是的,如果您可以推断出方法的纯度,那么您可以做一些有趣的事情来自动并行化它。麻烦的是,几乎没有方法是真正的纯方法。此外,假设您确实有一个纯方法;由于纯方法是进行内存的理想选择,并且由于内存会带来副作用(它会改变缓存!),因此采用纯方法然后使它们变得不纯非常有吸引力。

    正如乔·达菲(Joe Duffy)所说,我们真正需要的是某种“抑制副作用”的方法。一种在方法周围画一个框并说“此方法不是无副作用的,但是在此框之外看不到它的副作用”的某种方法,然后使用该事实来驱动安全的自动并行化。

    我很想找出将这些概念添加到C#之类的语言中的方法,但这全都是开放式研究问题。没有预期或暗示的 promise 。

    09-26 23:46
    查看更多