需要在Windows / Python中快速创build大量的新进程

为了testing一些安全软件,我需要能够在Windows中创build大量(可configuration)的新进程(不是线程!),很快,它们存在一个(可configuration的)时间段,然后干净地终止。 进程不应该做任何事情 – 只存在指定的时间。

最终,我想能够运行如下的东西:

C:\> python process_generate.py --processes=150 --duration=2500 

这将很快创build150个新的进程,使他们都活着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)) 

发现我可以在我的笔记本电脑上连续创build并终止大约70个进程/秒,创build的进程可以直接终止。 大约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.45秒内完成30个过程
  • 50个进程在3.68秒内完成
  • 100个程序在14秒内完成
  • 在43秒内完成200个过程
  • 在77秒内完成300个过程
  • 400个进程在111秒内完成

不是我所期望的 – 我希望能够以合理的线性方式扩展并行进程数,直到我遇到了瓶颈,但是我似乎几乎是直接打开了进程创build的瓶颈。 根据我运行的第一个代码,我预计在创buildstream程创build瓶颈之前,能够创build接近70个进程/秒的内容。

没有进入完整的规格,笔记本电脑运行完全修补的Windows XP,有4Gb RAM,否则空闲,是相当新的; 我不认为这会很快造成瓶颈。

我在这里用我的代码做了什么明显的错误,或者在12个月的笔记本电脑上真的是XP / Python并行进程创build效率低下?

Solutions Collecting From Web of "需要在Windows / Python中快速创build大量的新进程"

那么,Windows进程管理并不能很好地扩展。 有更多的进程,需要更长的时间插入一个新的调度。

现在将其与其他操作系统内核(例如Linux)进行比较,其中进程创建实际上是自内核2.6.8(引入了调度器的调度程序)以来的O(1)(恒定时间)。

请注意,我并不想在这里向您推销Linux。 我只是建议你在另一个操作系统上试试你的程序来看看你自己。

在分析和测试了一堆不同的场景之后,我发现在Windows下生成和杀死单个进程的速度要快得多,而不是一次生成N个进程,同时杀死所有N,然后再次重新启动N.

我的结论是,Windows保留足够的资源以便能够在相当快的时间启动1个进程,但是不足以启动> 1个新的并发进程而没有相当大的延迟。 正如其他人所说的那样,Windows在启动新进程时速度很慢,但显然速度会随着系统上已经运行的并发进程的数量而以半几何方式降低 – 启动一个进程非常快,但是当您启动多个进程时你遇到问题 无论存在多少CPU,机器多忙(我的测试中CPU通常<5%),无论是在物理服务器上运行还是在虚拟机上运行,​​有多少RAM都可用(我使用高达32Gb的测试内存,〜24Gb免费),… – 它似乎是Windows操作系统的限制。 当我在同一个硬件上安装Linux时,这个限制就消失了(按照哈维的回答),我们能够很快地同时启动许多进程。

如果我没有记错的话,与Linux相反,Windows从来没有被设计成快速启动许多进程。 这不是设计者认为你会做什么 – 而在Linux上,像inetd等东西,这是一个常见的足够的操作模型,以保证优化 – 所以,流程创建被优化如地狱。

我已经测试了您的代码在一个Ubuntu 11.04戴尔Precision与4Gb内存与这个结果:

 Started/stopped 100 processes in 0:00:00.051061 seconds Started/stopped 150 processes in 0:00:00.094802 seconds Started/stopped 200 processes in 0:00:00.153671 seconds Started/stopped 300 processes in 0:00:00.351072 seconds Started/stopped 400 processes in 0:00:00.651631 seconds Started/stopped 470 processes in 0:00:01.009148 seconds Started/stopped 1000 processes in 0:00:02.532036 seconds Started/stopped 10000 processes in 0:00:29.677061 seconds 

每次执行过程中至少有10%的变量具有相同数量的进程,希望这是有用的,在一秒钟内,我的计算机执行了将近500个进程。

我想争辩说,在Linux中,创建许多Python进程也有困难。 运行p.start()500次后,变得非常慢。

有时我需要创建数千个长时间工作的流程。

在上面的例子中,在一瞬间没有PROCESS_COUNT数量的活着进程,因为他们在1秒后开始完成工作。 所以如果在2秒之内创建1000个进程,超过一半的进程完成,直到创建过程结束。

 from multiprocessing import Process def sample(): sleep(13) start = time() for i in range(1500): p = Process(target=sample) p.daemon = True p.start() end = time() print end - start 

我尝试了与SUSE ENTERPRISE 140Core服务器,并在我的笔记本电脑与Ubuntu – 动态是相同的(服务器结果):

 500 processes start - 1.36 s 1000 processes start - 9.7 s 1500 processes start - 18.4 s 2000 processes start - 24.3 s 3000 processes start - 43.3 s 

这是因为这个前叉叫。 每个新的孩子过程需要更长的时间

 def _cleanup(): # check for processes which have finished for p in list(_current_process._children): if p._popen.poll() is not None: _current_process._children.discard(p) 

据我所知,如果进程有manager.Value,并且稍重一点 – 它需要十分之一GB的内存,并开始一点点。