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

相關文章
相關標籤/搜索