python 多進程處理 multiprocessing模塊

前提: 有時候一個用一個進程處理一個列表中的每個元素(每個元素要傳遞到一個函數中進行處理),這個時候就要用多進程處理



1 現場案例:


我有一個[ip1,ip2,ip3,.......]這樣的列表,我要每個元素ip傳遞給一個get_ping_info(addr)函數得到返回延遲信息,然後將結果到一保存個result列表中,如果用一個單進程執行的話可能需要幾分鐘,但是如果多進程處理就可以縮減幾倍的速度了


用法:(程序代碼只截圖了部分,不可運行)

pool.apply_async(函數名, (函數的參數1,函數的參數2,函數的參數3))


import multiprocessing
def get_ping_info(create_time,prov,city,net_type,addr):
    result = ping.quiet_ping(addr, timeout=2, count=5, psize=64)
    loss_rate = result[0]
    max_time = float('%.3f'% result[1]) if isinstance(result[1], float) else 0
    #if max_time and average_time is None use 0
    average_time = float('%.3f'% result[1]) if isinstance(result[2], float) else 0
    print create_time,prov,city,net_type,loss_rate, average_time
    return (create_time,prov,city,net_type,loss_rate, average_time)



if __name__ == "__main__":
    all_city_result_tmp = []
    all_city_result = []
    create_time = datetime.now()
    city_list = get_city_list()
    pool = multiprocessing.Pool(processes=4)
    for prov,city,addr in city_list:
        all_city_result_tmp.append(pool.apply_async(get_ping_info, (create_time,prov,city,'CTC',addr )))
    pool.close()
    pool.join()
    for city_info in all_city_result_tmp:
        #print city_info.get()
        all_city_result.append(city_info.get())

   


注意: 

1 all_city_result_tmp 只是多線程多線的列表,其中列表中的元素.get() 函數纔會去執行元素對象,對象中有執行get_ping_info函數的信息和返回值



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