質問

小さなpythonアプリケーションを作成しました。ここでは、通常の実行中にタスクマネージャーがどのように見えるかを確認できます。
(ソース: weinzierl.name

アプリケーションは完全にマルチスレッドですが、当然ながら1つのCPUコアのみを使用します。 最新のスクリプト言語のほとんどがマルチスレッドをサポートしているという事実に関係なく、スクリプトは 1つのCPUコアでのみ実行できます

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

組み込みのスクリプト言語はありますか シングルコアに限定されないスレッドのサポート?

ラップアップ

回答は私が期待したものではありませんでしたが、 < code> TCL answer が近づいています。 perl を追加したいと思います。( TCL と同様)インタプリタベースのスレッドがあります。

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

Aiden Bellの回答を< em>承認済みの回答。 彼は特定の言語を提案していませんが、彼の発言は私にとって最も洞察力がありました。

役に立ちましたか?

解決

スレッド構文は静的な場合がありますが、オペレーティングシステムと仮想マシン間での実装が変更される場合があります

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

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

他のヒント

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

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

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

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

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

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オブジェクトを操作しているとき、1つのスレッドが実行され、他のスレッドが待機しています。彼らはこれをGIL(Global Interpreter Lock)と呼びます。これは、プロセス内で実際の並列処理を不可能にする主な問題です。

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

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

Guileは、ハードウェアスレッドと思われるPOSIXスレッドをサポートしています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top