为了测试一些安全软件,我需要能够在
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个过程/秒速率持续约一小时的持续时间.
当我将代码更改为
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.个过程在1.45秒内完成
在3.68秒内完成> 50个过程
> 14个过程在14秒内完成
> 43个过程在43秒内完成
> 77个过程在77秒内完成
> 111个过程在111秒内完成
这不是我的预期 – 我希望能够以合理线性的方式扩展并行进程计数,直到我遇到瓶颈,但我似乎几乎是直接打击了进程创建的瓶颈.根据我运行的第一个代码,我肯定希望在遇到进程创建瓶颈之前能够创建接近70个进程/秒的东西.
没有完整的规格,笔记本电脑运行完全修补的Windows XP,具有4Gb RAM,否则是空闲的,是相当新的;我认为这不会很快成为瓶颈.
我在使用我的代码做了什么明显的错误,或者在12个月大的笔记本电脑上创建的XP / Python并行进程是否真的效率低下?