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

时间:2009-06-16 15:58:18

标签: multithreading multiprocessing multicore green-threads

我编写了一个小python应用程序,在这里您可以看到任务管理器在典型运行期间的外观。
(来源:weinzierl.name

虽然应用程序完全是多线程的,但毫不奇怪它只使用一个CPU核心。 无论大多数现代脚本语言支持多线程,脚本只能在一个CPU核心上运行

Ruby,Python,Lua,PHP都只能在单核上运行。 即使Erlang,据说对并发编程特别有用,也会受到影响。

是否有内置的脚本语言 支持不限于单个核心的线程?

WRAP UP

答案并不是我的预期,但是the TCL answer接近了。 我想添加perl,它(很像TCL)具有基于解释器的线程。

Jython, IronPythonGroovy属于将经过验证的语言与另一种语言的成熟虚拟机相结合的保护伞。感谢您的提示 方向。

我选择Aiden Bell's回答为接受的答案。 他并没有提出某种语言,但他的评论对我来说是最有见地的。

9 个答案:

答案 0 :(得分:5)

您似乎使用了“脚本语言”的定义,可能会引起一些人的注意,我不知道这对您的其他要求意味着什么。

无论如何,你考虑过TCL吗?我相信它会做你想做的事。

由于您在列表中包含了相当通用的语言,因此我不知道您可以接受多么繁重的实现。如果其中一个广泛的Scheme实现不是本机线程,我会感到惊讶,但是我只记得曾经使用的MzScheme,但我似乎记得支持被删除了。当然,一些常见的LISP实现做得很好。如果Embeddable Common Lisp(ECL)有,它可能对你有用。我不使用它,所以我不确定它的线程支持状态是什么,这当然可能取决于平台。

更新另外,如果我没记错的话,GHC Haskell没有做到你所要求的,但可能会有效地做你想要的,因为我再次记得,它会旋转一个每个核心的本机线程,然后运行它们的线程......

答案 1 :(得分:4)

您可以在Jython(在JVM上,如@Reginaldo提到Groovy)和IronPython(在.NET上)等实现中使用Python 语言自由多线程。对于Python语言的经典CPython实现,正如@ Dan的评论所提到的,multiprocessing(而不是threading)是可以自由使用尽可能多的内核的方法

答案 2 :(得分:3)

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

答案 3 :(得分:3)

线程语法可能是静态的,但跨操作系统和虚拟机的实现可能会发生变化

您的脚本语言可能在一个操作系统上使用真正的线程,在另一个操作系统上使用假线程。

如果您有性能要求,可能需要确保脚本化线程落到操作系统中最有利的层。用户空间线程会更快,但是对于很大程度上阻塞线程活动的内核线程会更好。

答案 4 :(得分:2)

.NET 4上的F#非常支持并行编程和极佳的性能,并且支持专为脚本编写而设计的.fsx文件。我使用F#编写所有脚本。

答案 5 :(得分:2)

这个问题的答案已被接受,但只是补充一点,除了tcl之外,我所知道的唯一支持多线程和线程安全编程的其他解释脚本语言是Qore

Qore是自下而上设计的,支持多线程;语言的每个方面都是线程安全的;该语言旨在本地支持SMP可伸缩性和多线程。例如,您可以使用background运算符来启动新线程,或使用ThreadPool类来管理线程池。 Qore还会抛出常见线程错误的异常,这样程序员就可以立即看到线程错误(如潜在的死锁或线程API的错误,比如试图抓住当前线程已经拥有的锁)。

Qore还支持和线程资源;例如,DatasourcePool分配被视为线程本地资源;如果您在结束线程之前忘记提交或回滚事务,则DatasourcePool类的线程资源处理将自动回滚事务并抛出一个异常,其中包含有关问题及其如何的用户友好信息解决。

也许它可能对您有用 - Qore的功能概述在这里:Why use Qore?

答案 6 :(得分:1)

CSScriptParallel Extensions结合使用不应该是一个糟糕的选择。您使用纯C#编写代码,然后将其作为脚本运行。

答案 7 :(得分:0)

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

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

其他脚本语言可能存在同样的问题。

答案 8 :(得分:0)

Guile支持我认为是硬件线程的POSIX线程。