在python中經常會到用多線程處理某個函數來縮短運行時間。
from multiprocessing import Pool
def work(x):
return x+1
pool = Pool(processes=4) # 4個線程
x = [1,2,3,4,5,6]
results = pool.map(work, x)
print results
運行上面的程序就會多線程處理並打印出輸入x的計算結果。
但是這個函數僅允許函數的輸入變量為1,如果函數需要多個參數輸入,那個就無法用上面的程序。比如:
def work(x, y):
return x + y
遇到這種情況我們有一下幾種處理方法:
1).用partial函數提取主要的一個參數固定其他參數
比如,我們想用x去加一個固定值,那么我們就認為x是主要參數,固定y:
from functools import partial
partial_work = partial(work, y=1) # 提取x作為partial函數的輸入變量
results = pool.map(partial_work, x)
2). 將多個輸入變量打包到一個參數
#Python學習交流群:531509025
x = [1,2,3,4,5,6]
y = [1,1,1,1,1,1]
x_y = zip(x, y)
results = pool.map(work, x_y)
3). 使用pathos包下的multiprocessing
這個包是使用dill的multiprocessing的一個fork,允許多參數輸入:
from pathos.multiprocessing import ProcessingPoll as Pool
pool = Pool(4)
results = pool.map(work, x, y)
總結:
當函數的參數在不同時候的輸入均不同,那么前一種就不太合適。而在后面兩種中,用pathos會更簡單些,不太容易報pickling error。