并行映射(生成器)运算符
-
06-07-2019 - |
题
我有兴趣为我的语言定义一个并行映射运算符。它将列表转换为给定表达式的新列表。它的语法类似于生成器。与C#和Python中的生成器不同,如果编译器需要(例如,存在空闲核心,并且列表非常大),它可能会并行评估。它将被称为 withhe
,以区别于顺序执行的 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
中加入副作用的程序员来说,这是不是太不直观了?当然,我会说不要在文档中这样做,但大多数程序员不会阅读语言文档。 : - )
我想更大的问题是,现代程序员能否适应他们语言中的隐式并行列表处理语义,还是他们需要更明确的事情呢?
解决方案
你是对的,因为大多数用户都不会阅读文档,因此可能会将非线程安全的代码放在带有块的中(特别是名称和语法类似于<代码>的foreach 代码>)。您要么必须信任您的用户,要么对该块的并发安全性执行一些静态分析。如果你选择了后者,那么你也可以不打扰
withhe
- 只要在可能的情况下自动并行化 foreach
。
至于用户是否已准备好承担选择潜在危险的责任,只要他们事先知道什么是安全的,我就会打赌“是”。许多语言迫使你每天做出这个选择(指针,手动内存管理,共享内存并发)。您可能希望使语法不那么模糊(即称之为 parallelforeach
),以便人们知道他们注册了什么。
其他提示
您的意思是 pmap ?
不隶属于 StackOverflow