いくつかのセキュリティ ソフトウェアをテストするには、Windows で大量の (構成可能な) 多数の新しいプロセス (スレッドではない!) を非常に迅速に作成し、(構成可能な) 一定期間存在させてから、正常に終了できる必要があります。 . プロセスは何もしないでください。指定された期間だけ存在します。
最終的には、次のようなものを実行できるようにしたいと考えています。
C:\> python process_generate.py --processes=150 --duration=2500
これにより、150 個の新しいプロセスが非常に迅速に作成され、それらすべてが 2500 ミリ秒の間存続し、その後すべてができるだけ早く終了します。
出発点として、私は走った
from multiprocessing import Process
import os
def f():
pass
if __name__ == '__main__':
import datetime
count = 0
startime = datetime.datetime.now()
while True:
p = Process(target=f)
p.start()
p.terminate()
count += 1
if count % 1000 == 0:
now = datetime.datetime.now()
print "Started & stopped d processes in %s seconds" % (count, str(now-starttime))
そして、ラップトップで毎秒約 70 プロセスを連続して作成および終了できることがわかりました。作成されたプロセスはすぐに終了します。約 70 プロセス/秒の速度が約 1 時間持続しました。
コードを次のように変更したとき
from multiprocessing import Process
import os
import time
def f_sleep():
time.sleep(1)
if __name__ == '__main__':
import datetime
starttime = datetime.datetime.now()
processes = []
PROCESS_COUNT = 100
for i in xrange(PROCESS_COUNT):
p = Process(target=f_sleep)
processes.append(p)
p.start()
for i in xrange(PROCESS_COUNT):
processes[i].terminate()
now = datetime.datetime.now()
print "Started/stopped %d processes in %s seconds" % (len(processes), str(now-starttime))
PROCESS_COUNT にさまざまな値を試してみましたが、実際よりもはるかに優れたスケーリングを期待していました。PROCESS_COUNT のさまざまな値に対して、次の結果が得られました。
- 20 プロセスが 0.72 秒で完了
- 1.45秒で30プロセス完了
- 50 プロセスが 3.68 秒で完了
- 14秒で100プロセス完了
- 200 プロセスが 43 秒で完了
- 300 プロセスが 77 秒で完了
- 111 秒で 400 プロセスを完了
これは私が期待したものではありません.ボトルネックに達するまで、並列プロセス数を合理的に線形にスケールアップできると思っていましたが、プロセス作成のボトルネックにすぐにぶつかっているようです. 私が実行した最初のコードに基づいて、プロセス作成のボトルネックにぶつかる前に、1 秒あたり 70 プロセス近くのプロセスを作成できると確信していました。
完全な仕様には触れませんが、ラップトップは完全にパッチが適用された Windows XP を実行し、4Gb の RAM を搭載し、それ以外はアイドル状態であり、かなり新しいものです。こんなに早くボトルネックになるとは思えません。
ここでコードに明らかに間違ったことをしていますか、それとも XP/Python の並列プロセスの作成は、12 か月前のラップトップでは本当に効率が悪いのでしょうか?