背景:
想輸入一個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)