2

2 つの引数を取り、数値を出力する C プログラムがあります。

./a.out 2 3 (例)。

計算コストの高い操作を行うので、Python のマルチプロセッシング ライブラリを使用して一連の C プログラムを実行し、すべての数値をリストやテーブル、または何らかのデータ構造にコンパイルできないかと考えていました。

ありがとう。

これは重複ではありません。私の質問は、どうすれば並列で実行できるか (例: 多数のスレッド) です!

1 つの Python プログラムで数百の C プログラムを実行し、すべての出力を Python リストにキャプチャする方法がわかりません。使用プロセスは1対1のようです。

4

4 に答える 4

2

を使用して、ThreadPool多くのタスクを並行して実行できます。

from multiprocessing.pool import ThreadPool
import subprocess
def f(x):
    a, b = x
    res = subprocess.check_output(["./a.out", str(a), str(b)])
    return int(res.strip())
p = ThreadPool()
results = p.map(f, [(2,3), (5,6), (9,10)])
于 2012-10-13T15:15:50.990 に答える
1

subprocess.Popenスレッドを使用せずに、一度に複数のプロセスを実行するために使用できます。

それらからの出力がオペレーティング システムのバッファに収まるほど短い場合は、かなり簡単です。

プログラムを非同期で開始するには、次を使用します。

subprocess.Popen(['command', args],stdout=subprocess.PIPE)

すべてのコマンドに対してこれを行い、結果を配列に配置します。

それで:

 for process in subprocesses:
   process.wait()
   stdout,stderr = process.communicate()

サブプロセスが大量のデータを出力する場合、wait() がデッドロックするため、これは機能しません。プロセスはさらに書き込みたいのですが、バッファーがいっぱいで、プロセスが完了するのを待ってから読み取ります。

その場合、select.poll()または同様の APIを調べる必要があります。

于 2012-10-13T15:23:46.100 に答える
0

ctypesCプログラムをライブラリにコンパイルし、Pythonスクリプトからそのライブラリを呼び出すことができるPythonモジュールの使用を検討することをお勧めします。

また、swigプロジェクトを使用すると、問題なく Python から C または C++ コードを呼び出すことができます (この回答を参照してください)。

このルートに進む場合は、スレッドプールまたはその他の種類のメカニズムを使用して呼び出しを並行して行うことを検討する必要があります。

于 2012-10-13T18:18:09.557 に答える
0

Python の subprocess モジュールを使用してみると、プロセスを開始し、プロセスが終了するのを待って、すべての出力 (stdout、stderr) をキャプチャできます。

ここでサブプロセスのドキュメントを見ることができます: http://docs.python.org/library/subprocess.html

私の例を見ることができます:

#file t1.py

import time

def __main__():
    time.sleep(10)
    print(10)

if __name__ == "__main__":
    __main__()

#file: t2.py

import time
import subprocess

def __main__():
    N = 10
    V = 0

    pp = [subprocess.Popen("t1.py", stdout = subprocess.PIPE, shell = True) for _ in range(0, N)]
    oo = ["" for _ in range(0, N)]
    ff = [False for _ in range(0, N)]
    while True:
        for i in range(0, N):
            oo[i] += pp[i].stdout.read()
            if pp[i].poll() != None:
                ff[i] = True
        done = all(ff)
        if done:
            for o in oo:
                V += int(o)
            break
    print(V)

if __name__ == "__main__":
    __main__()

ファイル t2.py はまさにあなたが望むことをします。ファイル t1.py は、長時間実行される C プログラムをシミュレートします。

perh が正しいため、例を編集しました。サブプロセスが新しいプロセスを作成するため、ここではスレッドは必要ありません。また、プログラムの出力が大きい場合 (パイプの長さの制限よりも大きい場合) にデッドロックが発生する可能性があるため、パイプから読み取り、プロセスが終了するのを待つ必要があるという彼の意見も正しいです。

于 2012-10-13T15:13:05.847 に答える