11

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

虽然该应用程序完全是多线程的,但不出所料,它只使用一个 CPU 内核。尽管大多数现代脚本语言都支持多线程,但脚本只能在一个 CPU 内核上运行

Ruby、Python、Lua、PHP 都只能在单核上运行。甚至据说对并发编程特别擅长的 Erlang 也受到了影响。

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

包起来

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

Jython、IronPythonGroovy属于将一种经过验证的语言与另一种语言的经过验证的虚拟机相结合的范畴。感谢您在这个方向上的提示。

我选择Aiden Bell 的答案作为Accepted Answer。他没有建议一种特定的语言,但他的评论对我来说是最有见地的。

4

9 回答 9

5

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

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

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

更新 另外,如果我没记错的话,GHC Haskell 并没有完全按照你的要求做,但可能会有效地做你想做的事,因为我记得,它会在每个核心左右旋转一个本机线程,然后运行它跨越那些线程....

于 2009-06-16T16:13:00.343 回答
4

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

于 2009-06-16T16:04:46.800 回答
3

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

于 2009-06-16T16:00:56.097 回答
3

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

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

如果您有性能要求,则可能值得考虑确保脚本线程落入操作系统中最有益的层。用户空间线程会更快,但对于很大程度上阻塞线程活动,内核线程会更好。

于 2009-06-16T16:01:07.597 回答
2

.NET 4 上的 F# 对并行编程具有出色的支持和极好的性能,并且支持专门为脚本编写的 .fsx 文件。我使用 F# 编写所有脚本。

于 2010-08-10T22:49:53.790 回答
2

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

Qore 自下而上设计为支持多线程;该语言的每个方面都是线程安全的;该语言旨在原生支持 SMP 可扩展性和多线程。例如,您可以使用background运算符来启动新线程或使用ThreadPool类来管理线程池。Qore 还将抛出具有常见线程错误的异常,以便程序员立即看到线程错误(如潜在的死锁或线程 API 的错误,如试图获取当前线程已持有的锁)。

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

也许它可能对您有用 - 这里是 Qore 功能的概述:为什么使用 Qore?.

于 2016-06-19T11:29:21.837 回答
1

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

于 2009-06-16T16:28:13.210 回答
0

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

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

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

于 2015-04-09T08:07:23.720 回答
0

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

于 2017-06-22T02:56:07.760 回答