我编写了一个小python应用程序,在这里您可以看到任务管理器在典型运行期间的外观。
(来源:weinzierl.name)
虽然应用程序完全是多线程的,但毫不奇怪它只使用一个CPU核心。 无论大多数现代脚本语言支持多线程,脚本只能在一个CPU核心上运行。
Ruby,Python,Lua,PHP都只能在单核上运行。 即使Erlang,据说对并发编程特别有用,也会受到影响。
是否有内置的脚本语言 支持不限于单个核心的线程?
WRAP UP
答案并不是我的预期,但是the TCL
answer接近了。
我想添加perl
,它(很像TCL
)具有基于解释器的线程。
Jython, IronPython和Groovy属于将经过验证的语言与另一种语言的成熟虚拟机相结合的保护伞。感谢您的提示 方向。
我选择Aiden Bell's回答为接受的答案。 他并没有提出某种语言,但他的评论对我来说是最有见地的。
答案 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)
CSScript与Parallel Extensions结合使用不应该是一个糟糕的选择。您使用纯C#编写代码,然后将其作为脚本运行。
答案 7 :(得分:0)
它与线程机制无关。问题是(例如在python中)你必须得到解释器实例来运行脚本。要获取解释器,您必须锁定它,因为它将保留引用计数等,并且需要避免并发访问此对象。 Python使用pthread并且它们是真正的线程但是当你使用python对象时,只有一个线程运行其他线程等待。他们称之为GIL(全局解释器锁),这是使进程内部无法实现真正并行性的主要问题。
https://wiki.python.org/moin/GlobalInterpreterLock
其他脚本语言可能存在同样的问题。
答案 8 :(得分:0)
Guile支持我认为是硬件线程的POSIX线程。