27

IronPython に「スクリプト クラス」があり、アプリのスクリプトはそのインスタンスでメソッドを呼び出すことによって機能します。複数のスレッドからの呼び出しスクリプトを実装する必要があります。それを行う正しい方法は何ですか?

複数の懸念があります。

  1. ScriptScopeスレッドセーフですか?情報が矛盾しています。ScriptScope のドキュメントには「ScriptScope はスレッド セーフではありません。複数のスレッドが同じモジュールにアクセスできる場合、ホストはロックするか、スレッドごとにコピーを作成する必要があります。」ただし、IronRuby は同じ DLR を使用し、@JimmySchementi は次のように述べています。 ."

  2. 複数の を作成ScriptScopeすると、同じ初期化スクリプトを複数回実行することになります。10 個の Python スクリプト ファイルを実行し、5 つのアセンブリをインポートして、全体としてかなりの量のコードを実行し、"スクリプト オブジェクト" を準備するとします。スレッドごとに同じコードを大量に実行する時間とメモリのコストを回避する方法はありますか?

  3. ScriptScope変数をスレッド静的にして (つまり、 を適用して) 、途中ThreadStaticAttributeで使用されるすべてのスレッドに対して初期化を実行していますか? Task.RunまたはTaskScheduler、複数のスコープのコストが高いため、同時実行に制限を付けて使用する必要がありますか?

全体として、複数のスレッドで異なる引数で同じスクリプトを実行する方法を正しく実装するには? スクリプトは同時に実行する必要があり、競合状態が原因でクラッシュしてはなりません。

4

3 に答える 3

2

1.

ScriptScope のドキュメントにスレッドセーフではないと書かれている場合は、それを信じるか、少なくとも信じているように行動してください。@JimmySchementi は現在の実装を調べて、現在はスレッドセーフであると判断したかもしれませんが、次のメジャー リリースは言うまでもなく、クラスの次のパッチでどのように動作するかについての保証はありません。

2.

はい、各 ScriptScopes を初期化する必要があります。必要な ScriptScopes の数を最小限に抑えようとしますが、これを行う方法は設定によって異なります。関連するスレッドの主な目的が ScriptScope をホストすることである場合は、各スレッドが 1 つの ThreadLocal<ScriptScope> を持つ ThreadPool を使用する必要があります。これらのスレッドがスクリプトの実行だけでなく他のことも行っている場合は、ScriptScope を格納するオブジェクト プールが必要であり、各スレッドは ScriptScope をチェックアウトし、作業を行ってから ScriptScope を解放できます。

3.

このパスをたどる場合は、ThreadStatic よりもThreadLocalを優先してください。

于 2014-08-26T23:00:43.130 に答える
-1

具体的な答えが得られていないように見えるので、一般的な答えがあります。

私の同僚は以前の仕事で IronPhython を使用していましたが、マルチスレッドの処理が不可欠だったので、運用システムのマルチスレッド環境で IronPython を実行することは可能であると言えます。

彼が独自のロックを使用したのか、IronPython 内のロックに依存していたのかはわかりません。

私はお勧めします:

a) 自分でテストを実行します。安全かどうかを証明する簡単なテストを書くことができるはずです。次のコードのような粗雑なものが良い出発点になる可能性があります。

    [Test]
    public void TwoThreadsWithTheirOwnContexts() {
        //Create two threads
        var tasks = new Task[2];
        tasks[0] = Task.Factory.StartNew(PrintSomethingInIronPython1);
        tasks[1] = Task.Factory.StartNew(PrintSomethingInIronPython2);
        Task.WaitAll(tasks);
    }

b) とにかくロックを追加します。コードでロックを行うことは大きな問題ではない可能性があり、不確実性を取り除くことができます。

最終的に、ドキュメントが何かがスレッドセーフでないと言っている場合は、それを証明する (テスト) か、安全にプレイする (独自のロック) 必要があります。いずれにせよ、本番環境に入る前に、マルチスレッド テストを実行する必要があります。最初にそれらを行うことで、いつでも本当に失うことはないと思います。

Re 2: 繰り返しますが、提案のみです。一度初期化を行い、その後これらのスレッドを再利用するプール スレッドを作成します。

于 2013-07-03T02:40:41.570 に答える