2

何千ものバイナリ ファイルにアクセスするために使用している Dotnet で記述された dll がいくつかあります。データはディレクトリごとに区分されているため、パフォーマンスを向上させるために、複数のプロセスまたはスレッドを使用してファイルを処理することを考えました。

現在、メイン クラスの一部である関数があります (引数として self が必要です)。これは、プライベート メソッドに簡単にリファクタリングできます。

私の最初の傾向は Multiprocess モジュールを使用することですが、IronPython では利用できないようです。

私の次の考えは、タスクを使用することでした

def __createThreads(self):
    tasks = Array.CreateInstance(Task, 5)
    for idx in range(0, 5):
        tasks.append(Task.Factory.StartNew(self.__doWork, args=(idx,)))

    Task.WaitAll(tasks)

def __doWork(self, idx):

    for index in range (0, idx):
        print "Thread: %d | Index: %d" % (idx, index)

またはスレッドを使用するには

def __createThreads(self):
    threads = list()
    for idx in range(0, 5):
        t = Thread(ThreadStart(self.__doWork))
        t.Start()
        threads.append(t)

    while len(threads) > 0:
        time.sleep(.05)
        for t in threads:
            if(not t.IsAlive):
                threads.remove(t)

私が見つけられないのは、引数を渡す方法の IronPython の例です

4

1 に答える 1

1

あなたの2つの例は完全に同等ではないことに注意してください。タスク バージョンは、実行時にそれが適切であると判断された場合にのみ、実際の同時スレッドを作成/使用します ( TaskCreationOptions.LongRunningを指定しない限り)。ユースケースに適したものを決定する必要があります。

idx引数を__doWork関数に渡す最も簡単な方法は、ラムダを使用して値と呼び出しを取得することです。(この質問で説明されているように、スコープの問題に注意してください。これは、中間スコープを導入するための代替ソリューションも示唆しています)

tasks.append(Task.Factory.StartNew(lambda idx = idx: self.__doWork(idx)))

補足として: Task.WaitAll を満足させるには、タスク リストを配列に変換する必要があります。

于 2013-09-09T12:07:59.080 に答える