为了测试一些安全软件,我需要能够非常快速地在 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 的不同值,我得到以下结果:
- 0.72秒完成20个流程
- 1.45秒完成30道工序
- 3.68 秒完成 50 个流程
- 14 秒内完成 100 个流程
- 43 秒内完成 200 个流程
- 300 道工序在 77 秒内完成
- 111 秒内完成 400 个流程
这不是我所期望的——我希望能够以合理的线性方式扩大并行进程数量,直到我遇到瓶颈,但我似乎几乎马上就遇到了进程创建瓶颈。根据我运行的第一个代码,我绝对希望能够在遇到进程创建瓶颈之前创建接近 70 个进程/秒的东西。
无需详细了解完整规格,笔记本电脑运行完全修补的 Windows XP,具有 4Gb RAM,否则处于闲置状态并且相当新;我认为它不会这么快就遇到瓶颈。
我的代码是否在这里做任何明显错误的事情,或者在 12 个月大的笔记本电脑上创建 XP/Python 并行进程真的那么低效?