2016-12-29 6 views
-1

誰かが次のコードが正しく実行されない理由を理解できますか?以前のプロセスが終了すると新しいプロセスが生成されますが、このコードを実行すると自動的にすべてが実行されます。つまり、すべてのジョブレポートは終了していないときに終了し、ウィンドウも開いています。なぜis_alive()の考えは、実際には真である場合にfalseを返しますか?どのようにマルチプロセッシング(python)モジュールを間違って使用していますか?

import subprocess 
import sys 
import multiprocessing 
import time 

start_on = 33 #'!' 
end_on = 34 
num_processors = 4; 
jobs = [] 

def createInstance(): 
    global start_on, end_on, jobs 
    cmd = "python scrape.py" + " " + str(start_on) + " " + str(end_on) 
    print cmd 
    p = multiprocessing.Process(target=processCreator(cmd)) 
    jobs.append(p) 
    p.start() 
    start_on += 1 
    end_on += 1 
    print "length of jobs is: " + str(len(jobs)) 

def processCreator(cmd): 
    subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE) 

if __name__ == '__main__': 
    num_processors = input("How many instances to run simultaneously?: ") 
    for i in range(num_processors): 
     createInstance() 

    while len(jobs) > 0: 
     jobs = [job for job in jobs if job.is_alive()] 
     for i in range(num_processors - len(jobs)): 
      createInstance() 
     time.sleep(1) 

    print('*** All jobs finished ***') 
+0

:私もcmd定義(see docs)を変更しましたか? –

+1

これは本当にhttp://softwareengineering.stackexchange.com/またはhttp://codereview.stackexchange.com/に適した質問のようです。このような複雑なものに取り組むのを助けようとしている人々がもっといるかもしれません。スタックオーバーフローは、実際には特定のコードの問題を解決するためのものです。 –

+0

コードレビューは、*コード*(ヘルプセンターに記載されているその他の条件が満たされている場合)にのみ適切です。これは頼まれているほど広すぎますが、CRのどちらにも適合しません。 –

答えて

0

あなたのコードは、各createInstance()呼び出しで2つのプロセスを生成され、私はそれがis_alive()電話をいじりだと思います。

p = multiprocessing.Process(target=processCreator(cmd)) 

processCreator(cmd)を実行するプロセスが1つ生成されます。次に、subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE)は、コマンドを実行する子プロセスを生成します。このサブプロセスは直ちに戻り、親プロセスを返します。

このバージョンでは、multiprocessの使用を削除しても問題ありません。私はすべてのあなたの質問を読んでいないが、あなたはマルチプロセッシングモジュールを見てきました

import subprocess 
import sys 
import time 

start_on = 33 #'!' 
end_on = 34 
num_processors = 4; 
jobs = [] 

def createInstance(): 
    global start_on, end_on, jobs 
    cmd = ["python","scrape.py", str(start_on), str(end_on)] 
    print(str(cmd)) 
    p = subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE) 
    jobs.append(p) 
    p.start() 
    start_on += 1 
    end_on += 1 
    print "length of jobs is: " + str(len(jobs)) 

if __name__ == '__main__': 
    num_processors = input("How many instances to run simultaneously?: ") 
    for i in range(num_processors): 
     createInstance() 

    while len(jobs) > 0: 
     jobs = [job for job in jobs if job.poll() is None] 
     for i in range(num_processors - len(jobs)): 
      createInstance() 
     time.sleep(1) 

    print('*** All jobs finished ***') 
+0

また、ジョブを終了する際に問題が発生する可能性があります。 whileセクションを終了するには、すべてのジョブが1秒以内に終了する必要があります。そうでない場合は、素晴らしい無限ループがあります。 – charli

関連する問題