0

我試圖使用python的多道處理庫,但我遇到了一些困難:多進程Python中的函數,進行了多個參數

def request_solr(limit=10, offset=10): 
    # build my facets here using limit and offset 
    # request solr 
    return response.json() 

def get_list_event_per_user_per_mpm(limit=100): 
    nb_unique_user = get_unique_user() 
    print "Unique user: ", nb_unique_user 
    processor_pool = multiprocessing.Pool(4) 
    offset = range(0, nb_unique_user, limit) 
    list_event_per_user = processor_pool.map(request_solr(limit), offset) 
    return list_event_per_user 

我不知道如何將第二參數傳遞給函數。我怎樣才能使它工作。我有以下錯誤:

TypeError: 'dict' object is not callable 

回答

1

您需要爲此使用lambda表達式。您現在正在執行此操作的方式,它試圖將request_solr作爲函數的結果映射爲offset作爲參數。

這應該可以做到。

processor_pool.map(lambda x: request_solr(limit, x), offset) 

注意,這隻適用於3.x.在2.x中,您需要創建一個函數對象。例如:

class RequestSolrCaller: 
    def __init__(self, limit) 
     self.limit = limit 
    def __call__(self, offset) 
     return request_solr(self.limit, offset) 

processor_pool.map(RequestSolrCaller(limit), offset) 
+0

我有以下錯誤:PicklingError:不能鹹菜<類型「功能」>:屬性查找__builtin __功能失效 – mel

+1

@mel啊,你必須在2.x的這隻適用於3.x,我會將其添加到答案。 –

2

你看到的錯誤,因爲你調用的函數之前將它傳遞給多。

我建議你結合使用starmapitertools.repeat

import itertools as it 

# rest of your code 

processor_pool = multiprocessing.Pool(4) 
offset = range(0, nb_unique_user, limit) 
list_event_per_user = processor_pool.starmap(request_solr, zip(it.repeat(limit), offset)) 

星圖將調用功能擴展值對成兩個參數。 repeat(limit)只是生成一個迭代器,其所有元素都等於limit

這可以爲任意數量的參數工作:

def my_function(a, b, c, d, e): 
    return a+b+c+d+e 

pool = Pool() 
pool.starmap(my_function, [(1,2,3,4,5)]) # calls my_function(1,2,3,4,5) 

由於您使用的是舊版本的Python,你必須解決這個通過修改你的功能或使用包裝函數:

def wrapper(arguments): 
    return request_solr(*arguments) 

# later: 

pool.map(wrapper, zip(repeat(limit), offset)) 
+0

我有以下錯誤:AttributeError:'Pool'對象沒有屬性'starmap' – mel

+1

@mel這是因爲您使用的是古代版本的python。我會寫一個替代方案。 – Bakuriu

+0

謝謝我將編輯標籤python到python2.7 – mel

1

我曾經使用一個生成器來生成關鍵字。這是我的simple_multiproc.py的內容。

請注意在等級模塊中使用request_solr的重要性。

import multiprocessing 

MAX=5 

def _get_pool_args(**kw): 
    for _ in range(MAX): 
     r = {"limit": 10, "offset": 10} 
     r.update(kw) 
     yield r 


def request_solr(limit=10, offset=10): 
    # build my facets here using limit and offset 
    # request solr 
    print(locals()) 
    response.json() 

if __name__ == "__main__": 
    pool = multiprocessing.Pool(MAX) 
    pool.map(request_solr, _get_pool_args())