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

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

Ruby、Python、Lua、PHP 都只能在单核上运行。就连据说特别适合并发编程的Erlang也受到了影响。

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

包起来

答案并不完全符合我的预期,但是 TCL 回答 接近了。我想补充一下 perl, ,这(很像 TCL)具有基于解释器的线程。

Jython、IronPython格罗维 属于将一种经过验证的语言与另一种语言的经过验证的虚拟机相结合的范畴。感谢您在此的提示 方向。

我选择了 艾登·贝尔的 回答为 接受的答案。他没有提出某种特定的语言,但他的话对我来说是最有洞察力的。

有帮助吗?

解决方案

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

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

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

其他提示

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

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

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

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

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

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

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

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

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

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

也许它对你有用 - Qore的功能概述在这里:为什么要使用Qore?

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

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

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

其他脚本语言可能也有同样的问题。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top