unix上有os.fork() 功能,能够在unix上运行,但不能在wins上运行。python
python是跨平台的,因此建立了一个multiprocessing模块app
multiprocessing
模块提供了一个Process
类来表明一个进程对象,下面的例子演示了启动一个子进程并等待其结束:dom
from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): print 'Run child process %s (%s)...' % (name, os.getpid()) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Process(target=run_proc, args=('test',)) print 'Process will start.' p.start() p.join() print 'Process end.'
multiprocessing 提供了Pool class来批量生成子进程async
from multiprocessing import Pool import os, time, random def long_time_task(name): print 'Run task %s (%s)...' % (name, os.getpid()) start = time.time() time.sleep(random.random() * 3) end = time.time() print 'Task %s runs %0.2f seconds.' % (name, (end - start)) if __name__=='__main__': print 'Parent process %s.' % os.getpid() p = Pool() for i in range(5): p.apply_async(long_time_task, args=(i,)) print 'Waiting for all subprocesses done...' p.close() p.join() print 'All subprocesses done.'
p.join()没有timeout设置,放到close()以后,close以后的P就没法产生新的子进程操作系统
请注意输出的结果,task 0
,1
,2
,3
是马上执行的,而task 4
要等待前面某个task完成后才执行,这是由于Pool
的默认大小在个人电脑上是4,所以,最多同时执行4个进程。这是Pool
有意设计的限制,并非操做系统的限制。若是改为:设计
p = Pool(5)
就能够同时跑5个进程。unix
因为Pool
的默认大小是CPU的核数code