2017-05-24 7 views
0

私はPopenの仕組みについて少し混乱しています。私はこれが何かばかげていると思っています。複数のプロセスを実行し、完了を調整する

これは、これを行うために提供されたユーティリティ(CSSBACKUP)を使用して、3つ組のスキーマ(テーブルスペース)をバックアップしています。

for i in range(len(schematype)): 
    schema_base = schemaname + '_' + schematype[i] # we need this without the trailing space. 
    outputstring = base_folder + '\\' + schemaname + '\\' + schema_base + '_' + timestr + '_cssbackup ' 
    rc = os.unlink(outputstring) # wont run if there is a backup already 
    logstring = base_folder + '\\' + schemaname + '\\' + schema_base + '_' + timestr + '.log' 
    exString = "cssbackup " + phys_string + '-schema '+ schema_base + ' ' + '-file ' + outputstring + '-log '+ logstring 
    logging.debug(exString) 
    processlist.append(subprocess.Popen(exString)) # start a seperate thread for each one, but we don't want to proceed until processlist[].poll == None (thread is complete) 
    procdone[i] = False 

今、私はすべてのプロセスが出現していることを、私はこれを実行すると、私は期待していものを得ることはありません

while finishit < len(schematype): 
    time.sleep(CSTU_CFG.get(hostname).get("logintv"))         # need a delay to keep this program from thrashing 
    for i in range(len(schematype)):       # check each of the procs 
     if procdone[i] is not True:         # if it completed, skip it 
      if processlist[i].poll is not None:     # if it returns something other than "none" it's still running 
       logging.debug(' Running '+ schematype[i] + ' ' + str(processlist[i])+ ' '+ str(time.time() - start_time)) 
       procdone[i] = False 
      else: 
       procdone[i] = True        # None was returned so it's finished 
       logging.debug(' Ended '+ schematype[i])   # log it 
       finishit = finishit + 1       # update the count 
       processlist[i].kill        # kill the process that was running (Saves memory) 

logging.debug('Dump functions complete')   

をそれらを同期する必要があります。私は帰りにpidを期待していたが、私はそれを見ない。ですから、.pollコマンドには役に立ちません。

したがって、プログラムは、それが生成したシェルがなくなっても永遠に実行されます。

何か基本的なものがありません。

おかげ

11:26:26133ルート、DEBUG実行ローカル30.014784812927246 11:26:26133ルート、DEBUG実行MNGT 30.014784812927246 11:56148:26 26:中央30.014784812927246 11を実行26133根、DEBUG 26:56148ルート、中央60.02956962585449 11実行DEBUG:26:56148ルート、DEBUG実行MNGT 60.02956962585449 11:27:26162ルート、ローカル90.04435467720032 11実行DEBUG:27:26162ルートを、11 60.02956962585449ローカルランニングルート、DEBUG DEBUGランニングセントラル90.04435467720032 11:27:26,162ルート、DEBUGランニ27::56177ルート、中央120.05913925170898 11実行DEBUG:27:56177ルート、DEBUG実行MNGT 120.05913925170898 11:28:26192ルート、ローカル実行DEBUGをNG MNGT 90.04435467720032 11:27:11 120.05913925170898ローカル実行56177根、DEBUG 150.07392406463623

答えて

2

に電話する必要があります。 if processlist[i].poll is not Noneは、processlist[i].pollが関数オブジェクトであり、processlist[i].poll()の結果ではないため、常にTrueと評価されます。

編集:これは、提案したよう

p = multiprocessing.Pool(n) 
p.map_async(subprocess.call, commands) 

のような何かをする非常に複雑な方法を探します 、あなたはマルチプロセッシングモジュールをチェックすることもできます。

+0

これは頭を叩く瞬間でしたが、今や新たな問題が発生しました。私がそれを走らせると、プロセスは稼働し続けましたが、プロセスチェッカーは続けました。だから私は、作成の直後に.poll()を追加し、それらはNoneで作成されたようです。だから、これは私を近づけますが、そこにはありません。だからおそらく私の問題はpopen(exString)ですか? – WDickens

+0

ここには複数の詳細があります。例えば、 'subprocess.Popen'は引数のリストか' shell = True'引数を必要とします。 'poll()'は、実行中はNoneを返し、終了時にはリターンコードを返します。私はまた、プロセスが終了した後でプロセスを終了する必要はないと考えています。一般的には、最小限に抑えてhttps://stackoverflow.com/help/mcveという例があれば、デバッグが簡単になります。 – user1620443

+0

正直言って、それは逆の方法だと思っていましたが、逆さまのチェックを無くしても問題はありませんでした。私はその殺害を取り除くだろう。ありがとうございました – WDickens

関連する問題