python 多进程和多线程

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 0123是马上执行的,而task 4要等待前面某个task完成后才执行,这是由于Pool的默认大小在个人电脑上是4,所以,最多同时执行4个进程。这是Pool有意设计的限制,并非操做系统的限制。若是改为:设计

p = Pool(5)

就能够同时跑5个进程。unix

因为Pool的默认大小是CPU的核数code

相关文章
相关标签/搜索