Python多線程運行帶多個參數的函數

在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

相關文章
相關標籤/搜索