【问题标题】:Parallel Map (Generator) Operator并行映射(生成器)运算符
【发布时间】:2009-10-26 13:25:11
【问题描述】:

我有兴趣为我的语言定义一个并行映射运算符。它将一个列表转换为一个给定表达式的新列表。它的语法类似于生成器。与 C# 和 Python 中的生成器不同,如果编译器需要,它可能会被并行评估(例如,有一个空闲的内核,并且列表非常大)。它将被称为witheach 以区别于按顺序执行的foreach

例如考虑:

var f = function(int x) : int { return x * 2; }
var my_list = 0..1000000;
var my_mapped_list = witheach (i in mylist) yield f(i);

我的问题是,这对于可能在f 中添加副作用的程序员来说是否过于不直观?当然,我会说不要在文档中这样做,但大多数程序员不阅读语言文档。 :-)

我想更大的问题是,现代程序员能否适应他们语言中的隐式并行列表处理语义,还是他们需要更明确的东西?

【问题讨论】:

  • “他们需要更明确的事情吗”——是的,不要称它为“witheach”而是“WARNING_DO_NOT_SIDE_EFFECT_HERE_PARALLEL_MAP”。
  • 我猜这有点过分了吧?

标签: concurrency functional-programming generator semantics language-design


【解决方案1】:

您说得对,大多数用户不会阅读文档,因此可能会将非线程安全代码放在witheach 块中(尤其是名称和语法与foreach 非常相似)。您要么必须信任您的用户,要么对该块的并发安全性执行一些静态分析。如果您选择后者,那么您最好不要理会witheach - 尽可能自动并行化foreach

至于用户是否准备好承担选择潜在危险的责任,我会打赌“是”,只要他们事先知道什么是安全的。许多语言每天都强迫您做出这种选择(指针、手动内存管理、共享内存并发)。您可能希望使您的语法不那么含糊(即称其为parallelforeach),以便人们知道他们在注册什么。

【讨论】:

    【解决方案2】:

    你的意思是pmap

    【讨论】:

    • 是的,实际上是一样的,只是语法更接近 Java。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多