1. 程式人生 > >python 多進程——使用進程池,多進程消費的數據)是一個隊列的時候,他會自動去隊列裏依次取數據

python 多進程——使用進程池,多進程消費的數據)是一個隊列的時候,他會自動去隊列裏依次取數據

10個 sta find 因此 pool 時間 import nbsp load

我的mac 4核,因此每次執行的時候同時開啟4個線程處理:

# coding: utf-8

import time
from multiprocessing import Pool


def long_time_task(name):
    print task %s starts running % name
    time.sleep(3)
    print task %s ends running --3 seconds % name


if __name__ == __main__:
    start = time.time()
    p = Pool()
    
for i in range(10): # CPU有幾核,每次就取出幾個進程 p.apply_async(func=long_time_task, args=(i,)) p.close() # 調用join()之前必須先調用close(),調用close()之後就不能繼續添加新的Process了 p.join() # 對Pool對象調用join()方法會等待所有子進程執行完畢 end = time.time() print(多進程(非阻塞)執行共需時間為:%.2f % (end - start))

運行效果:

task 0 starts running
task 1 starts running
task 2 starts running
task 3 starts running
task 0 ends running --3 seconds
task 1 ends running --3 seconds
task 3 ends running --3 seconds
task 2 ends running --3 seconds
task 4 starts running
task 5 starts running
task 6 starts running
task 7 starts running
task 5 ends running --3 seconds
task 4 ends running --3 seconds
task 7 ends running --3 seconds
task 6 ends running --3 seconds
task 8 starts running
task 9 starts running
task 8 ends running --3 seconds
task 9 ends running --3 seconds
多進程(非阻塞)執行共需時間為:9.13

解釋:

CPU先取出0-3號進程,執行完畢後,4~8號進程才開始執行。0-3號進程花了3秒鐘,4~8號 進程也花了3秒。最後兩個進程9,10又花了三秒,一共9秒。

也就意味著,我的代碼可以這樣寫,當history_ddos(多進程消費的數據)是一個隊列的時候,他會自動去隊列裏依次取數據

    f = open("history_ddos.json", "r")
    history_ddos = json.load(f)
    f.close()

    # 10表示進程池中最多有10個進程一起執行
    p = Pool(10)
    for item in history_ddos:
        
# find_ddos_botnet(item) p.apply_async(func=find_ddos_botnet(), args=(item,)) p.close() p.join()

python 多進程——使用進程池,多進程消費的數據)是一個隊列的時候,他會自動去隊列裏依次取數據