1. 程式人生 > >python並行化介紹及使用 Pool

python並行化介紹及使用 Pool

本篇將要介紹python的並行化,及簡單的應用。

主要介紹map函式的使用,一手包辦了序列操作、引數傳遞和結果儲存等一系列的操作。
首先是引入庫:
from multiprocessing.dummy import Pool
pool=Pool(4)
results=pool.map(爬取函式,網址列表)

本文將一個簡單的例子來看一下如何使用map函式以及這種方法與普通方法的對比情況。

import time
from multiprocessing.dummy import Pool

def getsource(url):
    html=requests.get(url)

urls=[]
for
i in range(1,21): newpage='http://tieba.baidu.com/p/3522395718?pn='+str(i) urls.append(newpage) timex=time.time() #測試一 for i in urls: getsource(i) print (time.time()-timex) #這裡是輸出的結果: #10.2820000648 time1=time.time() #測試二 pool=Pool(4) results=pool.map(getsource,urls) pool.close() pool.join() print
(time.time()-time1) #這裡是輸出結果: #3.23600006104

對比以上兩種方法,可以很明顯地看出 測試二比測試一要快很多。

對程式做一下解釋:
測試一種
for i in urls:
getsource(i) #使程式一直遍歷urls列表中的網址,然後迴圈呼叫getsource函式

測試二中:
pool=Pool(4) #聲明瞭4個執行緒數量,這裡的個數根據你電腦的CPU個數來定。
results=pool.map(getsource,urls) #這裡使用map函式,並且函式的引數為自定義函式名稱,以及函式中的引數(這裡為一個列表)
pool.close() #關閉pool物件
pool.join() #join函式的主要作用是等待所有的執行緒(4個)都執行結束後
print (time.time()-time1) #輸出所用時間差

列舉Pool的其他應用函式:

from multiprocessing import Pool

def f(x): #定義一個自定義函式f
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              # start 4 worker processes

    result = pool.apply_async(f, (10,))    # 評估"f(10)" asynchronously
    print result.get(timeout=1)           #限定反應時間為1 通過get函式取得result的結果

    print pool.map(f, range(10))          # prints "[0, 1, 4,..., 81]"

    it = pool.imap(f, range(10)) #使用imap函式執行自定義函式
    print it.next()                       # prints "0" 使用next函式一個一個地取得it的執行結果
    print it.next()                       # prints "1"
    print it.next(timeout=1)              # prints "4" unless your computer is *very* slow

    import time
    result = pool.apply_async(time.sleep, (10,))
    print result.get(timeout=1)           # raises TimeoutError