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


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

Хотя приложение идеально многопоточное, неудивительно, что оно использует только одно ядро процессора. Несмотря на то, что большинство современных скриптовых языков поддерживают многопоточность, скрипты могут работать только на одном ядре процессора. Ruby, Python, Lua, PHP-все они могут работать только на одном ядре. Даже Эрланг, который говорят, что это особенно хорошо для параллельного программирования, влияет.

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

ЗАВЕРНУТЬ

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

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

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

9 10

9 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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