2

os.systemfor ループ内でバックグラウンド プロセスを作成するために、多くの呼び出しを使用します。すべてのバックグラウンド プロセスが終了するのを待つにはどうすればよいですか?

os.wait子プロセスがないことを教えてくれます。

ps: Solaris を使用しています

ここに私のコードがあります:

#!/usr/bin/python
import subprocess
import os

pids = []
NB_PROC=30

for i in xrange(NB_PROC):
        p = subprocess.Popen("(time wget http://site.com/test.php 2>&1 | grep real )&", shell=True)
        pids.insert(0,p)
        p = subprocess.Popen("(time wget http://site.com/test.php 2>&1 | grep real )&", shell=True)
        pids.insert(0,p)

for i in xrange(NB_PROC*2):
        pids[i].wait()
os.system("rm test.php*")
4

2 に答える 2

6

通常、os.system()子プロセスが終了すると戻ります。ですから、本当に何もos.wait()する必要はありません。と同等subprocess.call()です。

subprocess.Popen()バックグラウンド プロセスを作成するために使用し、オブジェクトのwait()またはpoll()メソッドを使用しPopenて、それらが終了するのを待ちます。

デフォルトでは、Popen はシェルを生成せず、プログラムを直接実行します。これにより、リソースが節約され、シェル インジェクション攻撃の可能性が防止されます。

のドキュメントによるとos.system()

subprocess モジュールは、新しいプロセスを生成し、その結果を取得するためのより強力な機能を提供します。この関数を使用するよりも、そのモジュールを使用することをお勧めします

複数のジョブを並行して実行する場合はmultiprocessing、 、特にPoolオブジェクトの使用を検討してください。いくつかのプロセスにまたがる農作業の詳細の多くを処理します。

編集:プログラムの実行のタイミング。

import time
import subprocess

t1 = time.clock()
t2 = time.clock()
overhead = t2-t1

t1 = time.clock()
subprocess.call(['wget', 'http://site.com/test.php'])
t2 = time.clock()
print 'elapsed time: {:.3f} seconds.'.format(t2-t1-overhead)
于 2012-08-22T10:21:28.487 に答える
3

ソリューションは確かにサブプロセスモジュールにありました

#!/usr/bin/python
import subprocess
import os

pids = []
NB_PROC=4
cmd="(time wget http://site.com/test.php 2>&1 | grep elapsed | cut -d ' ' -f 3)"

for i in xrange(NB_PROC):
    p = subprocess.Popen(cmd,stdin=None,stdout=None, shell=True)
    pids.insert(0,p)
    print "request %d processed" % (i+1)


for i in xrange(NB_PROC):
    pids[i].wait()
os.system("rm test.php*")

その過程でdebianに切り替えましたが、何らかの理由でスクリプトがハングすることがありますが、正常に実行されることもあります

于 2012-08-26T16:16:39.920 に答える