哪些脚本语言支持多核编程?

14
我已经编写了一个小型的Python应用程序,您可以在此处查看典型运行时任务管理器的外观。
(来源: weinzierl.name) 虽然该应用程序完全支持多线程,但并不意外地仅使用一个CPU核心。 尽管现代大多数脚本语言都支持多线程,但脚本只能在一个CPU核心上运行
Ruby、Python、Lua、PHP都只能在单个核心上运行。 即使是被认为特别适合并发编程的Erlang也会受到影响。
是否有一种脚本语言内置支持不限于单个核心的线程? 总结 答案并不完全符合我的预期,但TCL的答案接近。 我想补充一下perl,它(就像TCL)具有基于解释器的线程。

Jython, IronPythonGroovy 属于将一种经过验证的语言与另一种经过验证的虚拟机结合起来的范畴。感谢您在这方面提供的提示。

我选择了 Aiden Bell's 的回答作为“被接受的答案”。他没有建议特定的语言,但他的评论对我最有见地。


1
你的问题标题与问题正文不符。Python的multiprocessing包是多进程,而不是多线程。我想你的意思是询问“哪些脚本语言支持多线程”。 - Dan Lorenc
1
这还要取决于您所谓的脚本语言是什么。您的定义是否包括PowerShell? C#呢?可以使用Visual Studio Tools for Applications从嵌入式脚本中调用它。 - John Saunders
@ Dan Lorenc:谢谢,我不知道multiprocessing在不同的上下文中有不同的含义。在问题中添加澄清。 - Ludwig Weinzierl
@John Saunders:我故意模糊了这个问题,因为我不想再引发一场关于什么是脚本语言的争论。我会说,以你认可的最广泛的脚本语言为准。 - Ludwig Weinzierl
@Kathy Van Stone:说得好,我从http://en.wikipedia.org/wiki/Green_threads复制了一份带有绿色线程的语言列表。但是我已经对其进行了大量编辑,因为正如http://stackoverflow.com/users/14143/simon指出的那样,它包含了一些并非真正的脚本语言。 - Ludwig Weinzierl
显示剩余3条评论
9个回答

5
你似乎使用了一个“脚本语言”的定义,这可能会引起一些争议,我不知道这对你的其他要求意味着什么。
无论如何,你考虑过TCL吗?我相信它可以做到你想要的。
由于你在列表中包含了相当通用的语言,我不知道可接受的实现有多重。我会很惊讶如果有亿万个Scheme实现之一不支持本地线程,但是我只记得MzScheme曾经支持过,但我似乎记得支持已经被取消了。当然,一些Common LISP实现也做得很好。如果Embeddable Common Lisp(ECL)支持,它可能适合你。我没有使用过它,所以我不确定它的线程支持状态如何,这当然可能取决于平台。
更新:此外,如果我记得正确,GHC Haskell并不完全符合你的要求,但可能会有效地满足你的需求,因为,再次提醒,据我记得,它会为每个核心启动一个本地线程,然后在这些线程上运行其线程...

我清理了“脚本”语言的列表,谢谢。 不过TCL是个好提示,似乎既没有GIL也没有绿色线程。 - Ludwig Weinzierl
TCL有自己的方法,但如果这是主要问题,您肯定可以让它使用所有核心。至少在我使用过的平台上(不是最近的),可以做到这一点。我怀疑它可能也不在默认构建中,但很容易打开并重新构建。 - simon
1
Tcl 绝对会启动本地线程;这基本上是你想在该语言中使用它们的唯一原因(因为它具有强大的异步 I/O 支持)。它们也很健壮,并且共享锁非常少,因此您可以获得良好的性能;它们已经在重型 Web 服务器等方面进行了大量生产测试... - Donal Fellows

4

在像Jython(基于JVM,如@Reginaldo提到的Groovy)和IronPython(基于.NET)这样的实现中,您可以自由地使用Python语言进行多线程。对于Python语言的经典CPython实现,如@Dan的评论所提到的,multiprocessing(而不是threading)是自由使用所有可用核心的方法。


JRuby的用户报告了出色的多线程支持(比标准Ruby更快)。 - undefined

3

由于Groovy基于Java虚拟机,因此您可以获得对真正线程的支持。


3

线程语法可能是静态的,但在操作系统和虚拟机上的实现可能会有所改变

你的脚本语言在一个操作系统上可以使用真正的线程,在另一个操作系统上可以使用伪线程。

如果你有性能要求,最好确保脚本线程落入操作系统中最有益的层。用户空间线程将更快,但对于大部分阻塞线程活动,内核线程将更好。


他说他对“绿色线程”不感兴趣。因此,用户空间线程不算。 - Crescent Fresh
有道理,但大多数现代操作系统都支持内核空间线程,而现代脚本语言似乎没有这样的支持。 真正的线程是指与进程相对应的线程,以排除那些指向Python的多处理模块或类似模块的答案。 - Ludwig Weinzierl
@Ludwig ... 这就是我的意思。语法支持和真正的支持是有区别的。不同的Python虚拟机可能以不同的方式处理相同线程语法的语义。其他操作系统上的脚本语言也是如此。 - Aiden Bell
@cresentfresh - 已确认。那个我没注意到 :) - Aiden Bell
我其实并不太在意我的线程是什么颜色;-) 说真的,据我所知,绿色线程无法在多个核心上运行,因此它们不算数。 - Ludwig Weinzierl

2
这个问题已经有了答案,但是补充一下,除了tcl之外,我所知道的唯一支持多线程和线程安全编程的解释性脚本语言是Qore
Qore从底层开始设计就支持多线程;语言的每个方面都是线程安全的;该语言被设计为原生支持SMP可扩展性和多线程。例如,您可以使用background运算符启动一个新线程或使用ThreadPool类来管理线程池。Qore还会抛出常见线程错误的异常,以便程序员立即看到线程错误(例如潜在死锁或尝试获取当前线程已持有的锁等线程API的错误)。
此外,Qore还支持线程资源;例如,DatasourcePool分配被视为线程本地资源;如果您在结束线程之前忘记提交或回滚事务,则DatasourcePool类的线程资源处理将自动回滚事务并抛出带有用户友好信息的异常,说明问题以及如何解决它。
也许这对你有用 - Qore功能概述在这里:为什么使用Qore?

2

.NET 4上的F#对并行编程有着出色的支持和极佳的性能,并且还支持专门设计用于脚本编写的.fsx文件。我使用F#进行所有脚本编写。


1

0

这与线程机制无关。问题在于(例如在Python中),您必须获取解释器实例才能运行脚本。要获取解释器,您必须将其锁定,因为它将保留引用计数等,并且需要避免对这些对象的并发访问。Python使用pthread,它们是真正的线程,但当您使用Python对象时,只有一个线程正在运行,其他线程在等待。他们称之为GIL(全局解释器锁),这是使进程内部的真正并行不可能的主要问题。

https://wiki.python.org/moin/GlobalInterpreterLock

其他脚本语言可能也会遇到类似的问题。


0

Guile支持POSIX线程,我相信它们是硬件线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接