在python中常常會到用多線程處理某個函數來縮短運行時間。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的計算結果。git
可是這個函數僅容許函數的輸入變量爲1,若是函數須要多個參數輸入,那個就沒法用上面的程序。好比:github
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). 將多個輸入變量打包到一個參數線程
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,容許多參數輸入:code
from pathos.multiprocessing import ProcessingPoll as Pool pool = Pool(4) results = pool.map(work, x, y)
總結:
當函數的參數在不一樣時候的輸入均不一樣,那麼前一種就不太合適。而在後面兩種中,用pathos會更簡單些,不太容易報pickling error。ip
參考:
https://github.com/uqfoundation/pathos
http://stackoverflow.com/questions/8804830/python-multiprocessing-pickling-error
http://stackoverflow.com/questions/5442910/python-multiprocessing-pool-map-for-multiple-argumentsget