2

ループ内で外部プロセスを複数回呼び出しています。擬似コードを提供するには:

for i in xrange(1, 100):
    call external proc which inserts a row into a table

ここでの問題は、外部プロセスが呼び出されるたびに別のスレッドで実行されるため、実行に時間がかかることです。そのため、python は実行を続行していたでしょう。これにより、挿入が行ロックに入り、挿入が妨げられます。

次の制約の下で、プロセスが完了するのを待つ理想的な方法は何ですか:

  1. 外部プロセスの動作方法を変更できません。
  2. できることはわかっていますが、thread.sleep のようなハックは使いたくありません。
  3. DB 設定を変更できません。

外部プロシージャを呼び出すコードは次のとおりです。

def run_query(query, username, password):
    try:
        process = subprocess.Popen( "<path to exe> -u " + username + " -p "+ password +" " + query, 
                                     shell = True,
                                     stdout = subprocess.PIPE,
                                     stderr = subprocess.PIPE )
        result, error = process.communicate()
        if error != '':
             _pretty_error('stderr', error)
    except OSError, error:
        _pretty_error('OSError', str(error))
    return result
4

3 に答える 3

1

subprocessドキュメントによると、いくつかのオプションがあります。

  • process.wait()走った後の呼び出しprocess = subprocess.Popen(...)
  • subprocess.callの代わりに使用Popen
  • subprocess.check_callの代わりに使用Popen
于 2013-03-04T09:15:26.197 に答える
0

結果がどのように見えるかに応じて、1 つの方法は wait() を使用することです。

process = subprocess.Popen( "<path to exe> -u " + username + " -p "+ password +" " + query, 
                             shell = True,
                             stdout = subprocess.PIPE,
                             stderr = subprocess.PIPE )
retcode = process.wait()
于 2013-03-04T09:16:04.403 に答える
0

次のようにプロセスを開始できます。

process = subprocess.call( ["<path to exe>", "-u", "username", "-p",  password, query], 
                                 shell = False)

この方法では、メイン プロセスはサブプロセスが終了するまでスリープしますが、出力は得られません。

于 2013-03-04T09:14:22.483 に答える