【python】python3多進程庫multiprocessing的採坑記錄

背景:

想輸入一個list,經過函數filter_noresult,判斷該list中哪些數據是有結果哪些數據沒結果,返回兩個list。

單進程執行的話,40w數據需要執行2小時。後來開了4個進程之後40w數據執行半小時就行。

使用的是:from multiprocessing import Pool

使用的是異步執行操作:pool.apply_async。

主要用的是很簡單的想法,先將40萬的數據切割成4份,然後每一份同時異步執行,最後再把結果合併起來。代碼如下所示:

執行異步操作的代碼如下所示:

origin_len = len(origin_line)
t=4    
    #先把數據分成4份 
    for i in range(t):
        origin_keyword_list.append(origin_line[round(origin_len*i/t):round(origin_len*(i+1)/t)]) 
    # 開啓4個進程
    pool = Pool(t)

    print("length of origin_keyword_list :",len(origin_keyword_list))    
    
    res_list = []
    # 執行異步操作,並將異步操作的數據結果存儲起來 
    for part in range(len(origin_keyword_list)):
        #!!!!異步執行操作, 
        res = pool.apply_async(func=filter_noresult,args=(origin_keyword_list[part],))
        res_list.append(res)
        #res_filted_list.append(res_filted) 

在上面執行異步操作的時候,在坑裏呆了很久,主要的錯誤是在:

res = pool.apply_async(func=filter_noresult,args=(origin_keyword_list[part],))

這句,當初在寫的時候沒有寫",",就是在傳遞參數的時候少寫了一個逗號,是這樣寫的:

res = pool.apply_async(func=filter_noresult,args=(origin_keyword_list[part]))

然後在獲取結果數據的時候就一直的報錯。

因爲之前在爲函數傳兩個參數的時候是這樣寫的:

result.append(pool.apply_async(word_filter, (i,black_list)))

是能夠正確執行的,但是隻傳一個參數的時候就一定要多加一個“,”

在獲得數據之後一下步就解析數據了,由於是在進程池中建立了4個進程,而每個進行返回2個list,所以結果res中數據的存儲爲:

res_list---<class 'list'>
        |----------ApplyResult
                   |----------good_keyword---<class 'list'>
                   |----------filted_keyword---<class 'list'>  

        |----------ApplyResult
                    |----------good_keyword---<class 'list'>
                    |----------filted_keyword---<class 'list'>
        |----------ApplyResult
                    |----------good_keyword---<class 'list'>
                    |----------filted_keyword---<class 'list'>
        |----------ApplyResult
                    |----------good_keyword---<class 'list'>
                    |----------filted_keyword---<class 'list'>

返回的時候會返回8片數據,數據是有序的,因此在奇數的都是good_keyword_list的part部分,偶數的都是filted_keyword_list的part部分。

那麼在合併數據的代碼爲:

flag_num = 0
    for res_part in res_list:
        for line in res_part.get():
            #print(type(line))
            flag_num += 1
            #print(type(line))
            #print(len(line))
            for i in line:
                if flag_num % 2 == 1:
                    good_keyword_all_list.append(i) 
                else:
                    filted_keyword_all_list.append(i)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章