mon*_*962 3 python windows performance multiprocessing
为了测试一些安全软件,我需要能够在Windows中创建一个大的(可配置的)新进程(不是线程!),非常快,让它们存在一段(可配置的)时间,然后干净地终止.这些过程根本不应该做任何事情 - 只存在指定的持续时间.
最终,我希望能够运行如下:
C:\> python process_generate.py --processes=150 --duration=2500
Run Code Online (Sandbox Code Playgroud)
它可以非常快速地创建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))
Run Code Online (Sandbox Code Playgroud)
并且发现我可以在笔记本电脑上连续创建和终止大约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))
Run Code Online (Sandbox Code Playgroud)
并为PROCESS_COUNT尝试了不同的值,我预计它会比它更好地扩展.我得到了不同的PROCESS_COUNT值的以下结果:
这不是我的预期 - 我希望能够以合理线性的方式扩展并行进程计数,直到我遇到瓶颈,但我似乎几乎是直接打击了进程创建的瓶颈.根据我运行的第一个代码,我肯定希望在遇到进程创建瓶颈之前能够创建接近70个进程/秒的东西.
没有完整的规格,笔记本电脑运行完全修补的Windows XP,具有4Gb RAM,否则是空闲的,是相当新的; 我认为这不会很快成为瓶颈.
我在使用我的代码做了什么明显的错误,或者在12个月大的笔记本电脑上创建的XP/Python并行进程是否真的效率低下?
嗯,Windows进程管理并不能很好地扩展.进程越多,将新的进程插入调度所需的时间就越长.
现在将其与其他操作系统内核进行比较,例如Linux,其中进程创建实际上是O(1)(常量时间),因为内核2.6.8(当引入了调度程序时).
请注意,我不打算在这里向你推销Linux.我建议您在不同的操作系统上试用您的程序,亲眼看看.
| 归档时间: |
|
| 查看次数: |
2021 次 |
| 最近记录: |