Какие языки сценариев поддерживают многоядерные программы?

Я написал небольшое приложение python, и здесь вы можете увидеть, как выглядит Диспетчер задач во время типичного запуска. http://weinzierl.name/temp/multicore-hires.png

Хотя приложение отлично многопоточно, неудивительно, что он использует только одно ядро ​​ЦП. Независимо от того, что большинство современных языков сценариев поддерживают многопоточность, скрипты могут работать только на одном ядре ЦП.

Ruby, Python, Lua, PHP все могут работать только на одном ядре. Даже Erlang, который, как говорят, особенно хорош для параллельного программирования, затронут.

Есть ли скриптовый язык, встроенный в поддержка потоков, которые не ограничены одним ядром?

WRAP UP

Ответы не совсем то, что я ожидал, но ответ TCL близок. Я хотел бы добавить perl, который (как и TCL) имеет потоки на основе интерпретатора.

Jython, IronPython и Groovy подпадают под понятие сочетания проверенного языка с проверенным виртуальная машина другого языка. Спасибо за ваши намеки в этом направление.

Я выбрал ответ Эйдена Белла в качестве принятого ответа. Он не предлагает конкретный язык, но его замечание было для меня наиболее проницательным.

Ответ 1

Синтаксис нити может быть статичным, но реализация между операционными системами и виртуальными машинами может меняться

Ваш язык сценариев может использовать истинную резьбу на одной ОС и поддельные потоки на другой.

Если у вас есть требования к производительности, возможно, стоит обратить внимание на то, чтобы потоки, написанные сценарием, попадали на самый полезный уровень в ОС. Потоки пользовательского пространства будут выполняться быстрее, но для большей блокировки потоков потоков поток будет лучше.

Ответ 2

Кажется, вы используете определение "язык скриптинга", который может поднять несколько бровей, и я не знаю, что это подразумевает в отношении ваших других требований.

В любом случае, вы считали TCL? Думаю, он сделает то, что вы хотите.

Поскольку вы включили в свой список довольно общие языки, я не знаю, насколько тяжелая реализация является приемлемой для вас. Я был бы удивлен, если одна из реализаций схемы zillion не связана с родными потоками, но с моей головы, я могу только помнить, что MzScheme использовался, но я, кажется, помню, что поддержка была удалена. Конечно, некоторые из распространенных реализаций LISP делают это хорошо. Если Embeddable Common LISP (ECL), это может сработать для вас. Я не использую его, хотя я не уверен, что такое поддержка его потоковой поддержки, и это, конечно, может зависеть от платформы.

Update Кроме того, если я правильно помню, GHC Haskell не делает то, что вы просите, но может эффективно выполнять то, что вы хотите, с тех пор, как я помню, он будет вращаться собственный поток на ядро ​​или около того, а затем запускайте его потоки через те...

Ответ 3

Вы можете свободно многопоточно использовать язык Python в таких реализациях, как Jython (на JVM, как @Reginaldo упоминает Groovy is) и IronPython (на .NET). Для классической реализации языка Python на языке CPython, как отмечается в комментарии @Dan, multiprocessing (а не threading) - это способ свободно использовать столько ядер, сколько доступно

Ответ 4

Поскольку Groovy основано на виртуальной машине Java, вы получаете поддержку для истинных потоков.

Ответ 5

F # на .NET 4 отлично поддерживает параллельное программирование и чрезвычайно хорошую производительность, а также поддерживает файлы .fsx, специально разработанные для сценариев. Я делаю все свои скрипты с помощью F #.

Ответ 6

Ответ на этот вопрос уже принят, но просто добавим, что помимо tcl единственный другой интерпретируемый язык сценариев, который я знаю об этом, поддерживает многопоточное и потокобезопасное программирование Qore.

Qore был разработан снизу вверх для поддержки многопоточности; каждый аспект языка является потокобезопасным; язык был разработан для поддержки масштабируемости SMP и многопоточности. Например, вы можете использовать оператор background для запуска нового потока или класса ThreadPool для управления пулом потоков. Qore также будет генерировать исключения с общими потоковыми ошибками, так что ошибки в потоке (например, потенциальные взаимоблокировки или ошибки с API-интерфейсами потоков, например, попытка захватить блокировку, которая уже удерживается текущим потоком), сразу видны программисту.

Qore дополнительно поддерживает и потоков ресурсов; например, распределение DatasourcePool рассматривается как локальный ресурс потока; если вы забыли совершить транзакцию или отменить транзакцию до того, как закончите свой поток, обработка ресурсов потока для класса DatasourcePool будет автоматически откатывать транзакцию и исключать исключение из удобной для пользователя информации о проблеме и о том, как она была решена.

Возможно, это может быть полезно для вас - обзор функций Qore можно найти здесь: Зачем использовать Qore?.

Ответ 7

CSScript в сочетании с Параллельные расширения не должно быть плохим вариантом. Вы пишете свой код в чистом С#, а затем запускаете его как script.

Ответ 8

Это не связано с механизмом нарезки. Проблема в том, что (например, на python) вам нужно получить экземпляр интерпретатора для запуска script. Чтобы получить интерпретатор, вы должны заблокировать его, поскольку он будет хранить счетчик ссылок и т.д. И должен избегать параллельного доступа к этим объектам. Python использует pthread, и они являются реальными потоками, но когда вы работаете с объектами python, только один поток запускает другие ожидания. Они называют этот GIL (Global Interpreter Lock), и это основная проблема, которая делает невозможным реальное parallelism внутри процесса.

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

Другие языки сценариев могут иметь одну и ту же проблему.

Ответ 9

Guile поддерживает потоки POSIX, которые, я считаю, являются аппаратными потоками.