11

私は小さな Python アプリケーションを作成しました。ここでは、通常の実行時にタスク マネージャーがどのように表示されるかを確認できます。 (出典: weinzierl.name )

アプリケーションは完全にマルチスレッド化されていますが、驚くことではありませんが、使用する CPU コアは 1 つだけです。最新のスクリプト言語のほとんどがマルチスレッドをサポートしているにもかかわらず、スクリプトは 1 つの CPU コアでしか実行できません

Ruby、Python、Lua、PHP はすべて、単一のコアでのみ実行できます。特に並行プログラミングに向いていると言われるErlangにも影響が出ています。

単一のコアに限定されないスレッドのサポートが組み込まれているスクリプト言語はありますか?

要約

答えは私が期待したものではありませんでしたがTCL答えは近づいています。を追加したいと思います。perlこれは (のようにTCL) インタープリターベースのスレッドを持っています。

Jython、IronPython、およびGroovyは、実績のある言語と実績のある別の言語の仮想マシンを組み合わせたものです。この方向へのヒントをありがとう。

Aiden Bell の回答をAccepted Answerとして選択しました。彼は特定の言語を示唆していませんが、彼の発言は私にとって最も洞察に満ちていました。

4

9 に答える 9

5

あなたは眉をひそめるような「スクリプト言語」の定義を使用しているようですが、それがあなたの他の要件について何を意味するのかわかりません。

とにかく、TCLを検討しましたか?それはあなたが望むことをするでしょう、私は信じています。

あなたのリストにはかなり一般的な目的の言語が含まれているため、実装がどれほど重いかはわかりません。無数の Scheme 実装の 1 つがネイティブ スレッドに対応していない場合、私は驚くでしょうが、頭のてっぺんから、以前の MzScheme しか覚えていませんが、サポートが削除されたことを覚えているようです。確かに、Common LISP の実装のいくつかはこれをうまく行っています。Embeddable Common Lisp (ECL) があれば、うまくいくかもしれません。私はそれを使用していないので、スレッド化サポートの状態がどのようなものかはわかりません。もちろん、これはプラットフォームに依存する可能性があります。

更新 また、私が正しく思い出せば、GHC Haskellはあなたが求めていることをまったく実行しませんが、私が思い出したように、コアごとにネイティブスレッドをスピンして実行するため、必要なことを効果的に行うことができますそれらにまたがるスレッド....

于 2009-06-16T16:13:00.343 に答える
4

Jython(@ReginaldoがGroovyについて言及しているように、JVM上)やIronPython(.NET上)などの実装で、Python言語を使用して自由にマルチスレッド化できます。@Danのコメントが言及しているように、Python言語の古典的なCPython実装の場合、multiprocessing(ではなくthreading)利用可能なコアを自由に使用する方法です

于 2009-06-16T16:04:46.800 に答える
3

Groovyは Java 仮想マシンに基づいているため、真のスレッドがサポートされます。

于 2009-06-16T16:00:56.097 に答える
3

スレッド構文は静的かもしれませんが、オペレーティング システムや仮想マシン全体での実装は変更される可能性があります

スクリプト言語は、ある OS では真のスレッドを使用し、別の OS では偽のスレッドを使用する場合があります。

パフォーマンス要件がある場合は、スクリプト化されたスレッドが OS で最も有益なレイヤーに到達することを確認することをお勧めします。ユーザー空間のスレッドの方が高速ですが、スレッド アクティビティを大幅にブロックする場合は、カーネル スレッドの方が優れています。

于 2009-06-16T16:01:07.597 に答える
2

この質問に対する回答は既に受け入れられていますが、追加するだけで、tcl 以外に、マルチスレッドとスレッドセーフ プログラミングをサポートする、私が知っている唯一のインタープリター型スクリプト言語はQoreです。

Qore は、マルチスレッドをサポートするように設計されています。言語のあらゆる側面がスレッドセーフです。この言語は、SMP のスケーラビリティとマルチスレッドをネイティブにサポートするように設計されています。たとえば、backgroundオペレーターを使用して新しいスレッドを開始したり、ThreadPoolクラスを使用してスレッドのプールを管理したりできます。また、Qore は一般的なスレッド エラーで例外をスローするため、スレッド エラー (潜在的なデッドロックや、現在のスレッドによって既に保持されているロックを取得しようとするようなスレッド API のエラーなど) がプログラマーにすぐに表示されます。

Qore はさらにスレッド リソースをサポートします。たとえば、DatasourcePool割り当てはスレッド ローカル リソースとして扱われます。スレッドを終了する前にトランザクションをコミットまたはロールバックするのを忘れた場合、クラスのスレッド リソース処理DatasourcePoolによってトランザクションが自動的にロールバックされ、問題とその解決方法に関するユーザー フレンドリな情報と共に例外がスローされます。

Qore の機能の概要は次のとおりです: Qore を使用する理由 .

于 2016-06-19T11:29:21.837 に答える
2

.NET 4 上の F# は、並列プログラミングの優れたサポートと非常に優れたパフォーマンス、およびスクリプト専用に設計された .fsx ファイルのサポートを備えています。私はすべてのスクリプトを F# を使用して作成しています。

于 2010-08-10T22:49:53.790 に答える
1

CSScriptParallel Extensionsと組み合わせることは、悪い選択肢ではありません。純粋な C# でコードを記述し、それをスクリプトとして実行します。

于 2009-06-16T16:28:13.210 に答える
0

糸通し機構とは関係ありません。問題は、(たとえば python で) スクリプトを実行するためにインタープリター インスタンスを取得する必要があることです。インタープリターを取得するには、参照カウントなどを保持するためにロックする必要があり、このオブジェクトへの同時アクセスを避ける必要があります。Python は pthread を使用し、それらは実際のスレッドですが、Python オブジェクトを操作しているときは、1 つのスレッドだけが実行され、他のスレッドは待機しています。彼らはこれを GIL (Global Interpreter Lock) と呼び、プロセス内で実際の並列処理を不可能にする主な問題です。

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

他のスクリプト言語にも同じような問題があるかもしれません。

于 2015-04-09T08:07:23.720 に答える